Я думаю, что здесь задают не тот вопрос.
Если вы хотите повысить скорость, с которой вы можете искать объект в List
, содержащем шесть миллионов записей, вам следует узнать, насколько быстро выполняются операции поиска этого типа данных.
Как обычно, Javadocs для этих классов довольно ясно указывают, какой тип производительности они предлагают:
HashMap :
Эта реализация обеспечивает постоянную производительность для основных операций (получение и сдача), при условии, что хеш-функция правильно распределяет элементы между сегментами.
Это означает, что HashMap.get (ключ) имеет значение O(1)
.
ArrayList
Операции size, isEmpty, get, set, iterator и listIterator выполняются в постоянное время. Операция добавления выполняется за амортизированное постоянное время, то есть для добавления n элементов требуется время O (n). Все остальные операции выполняются за линейное время (грубо говоря).
Это означает, что большинство операций ArrayList
- это O(1)
, но, вероятно, не те, которые вы использовали бы для поиска объектов, которые соответствуют определенному значению.
Если вы перебираете каждый элемент в ArrayList
и проверяете на равенство, или используете contains()
, то это означает, что ваша операция выполняется в O(n)
раз (или хуже).
Если вы не знакомы с обозначениями O(1)
или O(n)
, это означает, сколько времени займет операция. В этом случае, если вы можете получить постоянную производительность, вы хотите взять ее. Если HashMap.get()
равно O(1)
, это означает, что операции поиска занимают примерно одинаковое количество времени независимо от того, сколько записей на карте.
Тот факт, что что-то вроде ArrayList.contains()
равно O(n)
, означает, что количество времени, которое требуется, увеличивается с ростом размера списка; поэтому итерация по ArrayList
с шестью миллионами записей не будет очень эффективной.