2010-01-05 2 views
6

Привет У меня вопрос о том, следует ли использовать ArrayList или HashMap.Использование ArrayList или HashMap

Я пытаюсь создать программу Paint. Каждому изображенному объекту присваивается уникальный объект ID.

Если я хочу быстро получить скорость при нажатии на объект, должен ли я использовать arraylist или hashmap?

В общем случае hashmap имеет O (1), в то время как у arraylist есть скорость вывода O (n).

Однако, я думаю, что для моего случая, поскольку, когда я нажимаю на объект, я получу идентификатор, следовательно, индекс массива, и я могу сделать что-то вроде ArraylistObject.get (ithElement); , поэтому в этом случае это также будет процесс поиска O (1)?

любые входы?

Спасибо!

+0

Является ли ваш идентификатор таким же, как ваш индекс в массиве? –

ответ

6

Если объекты имеют идентификатор, который может быть сопоставлен 1-к-1 с массивом, чем это будет доступ к O (1), а на практике будет немного быстрее, чем поиск хэшмапа (у вас нет для вычисления хэша).

Однако проблема будет в том, что происходит, когда вы удаляете объект. У вас останется отверстие в списке. При создании новых объектов вы можете продолжать добавлять в список и оставлять его более медленно фрагментированным или пытаться найти запасной слот, в этом случае вы будете выполнять поиск O (n) свободного места.

Короче говоря, хэш-карта, вероятно, более уместна.

+2

Если его ArrayList в сборках Java, то массив должен быть смежным даже после удаления объекта (забудьте о деталях реализации).Однако, если идентификатор объекта такой же, как индекс массива, поведение будет еще более странным, так как после удаления определенного объекта идентификаторы могут начинать указывать на целый новый объект, поскольку все меняется, чтобы заполнить пробел. Так определенно HashMap. – Anurag

+0

Извините, забыл, что ArrayList перетаскивает базовый массив, когда элемент удален (было некоторое время с тех пор, как я делал Java), но да, ваша точка очень верна, что ссылки будут прикручены. – Paolo

+0

Весь смысл использования идентификатора в качестве индекса заключается в том, что вы не удаляете записи, а устанавливаете их в null. –

1

С другой стороны, вы можете сжать немного дополнительную производительность, выполнив ArrayLists в самый раз. Но удаление объектов будет королевской болью, как сказал Паоло и Анураг, вам придется либо положить пустой заполнитель (нуль?), Либо перенумеровать другой другой объект, чтобы заполнить пробел. Это, вероятно, приведет к ошибкам производительности и простым старым ошибкам.

HashMaps, с другой стороны. Простой в использовании, достойная производительность гарантирована (если вы не наложите свои идентификаторы действительно плохо).

И извлечение объектов по идентификатору может не оказаться узким местом вашего приложения. Как говорится, преждевременная оптимизация - корень всего зла.

1

Если вы можете гарантировать, что идентификаторы будут находиться в относительно небольшого численного диапазона, то вы должны использовать простой массив (с размером preinitialized до максимального ID), а не ArrayList. Это гарантирует, что вы случайно не удаляете записи и не переносите все остальное, чтобы заполнить пробел, причем все заканчивается неправильным индексом. Простой массив также будет немного быстрее, чем ArrayList.

Если вы не можете сделать такую ​​гарантию, используйте HashMap. Очень маловероятно, что разница в скорости будет заметна, и ее будет легче поддерживать.

Смежные вопросы