Если у вас есть 48 ГБ выделенной памяти для ваших 2-15 миллионов записей, лучше всего использовать HashMap<Key, Record>
, где ваш ключ — Integer
или String
в зависимости от ваших требований.
С коллизиями хэшей все будет в порядке, если вы предоставите достаточно памяти для Map
и имеете соответствующий коэффициент загрузки.
Я рекомендую использовать следующий конструктор: new HashMap<>(13_000_000);
(на 30% больше ожидаемого количества записей, которое будет автоматически расширено реализацией HashMap
до 2^24
ячеек). Сообщите своему приложению, что этот Map
будет очень большим с самого начала, поэтому ему не нужно автоматически увеличиваться по мере его заполнения.
HashMap
использует время доступа O(1)
для своих членов, тогда как TreeMap
использует время поиска O(log n)
, но может быть более эффективным с памятью и не нуждается в умной функции хеширования. Однако, если вы используете ключи String
или Integer
, вам не нужно беспокоиться о разработке хэш-функции, и поиск с постоянным временем будет огромным улучшением. Кроме того, еще одним преимуществом TreeMap
/TreeSet
является отсортированный порядок, который, как вы заявили, вас не волнует; используйте HashMap
.
Если единственной целью списка является проверка уникальных номеров счетов, то все, что я сказал выше, по-прежнему верно, но, как вы указали в своем вопросе, вы должны использовать HashSet<String>
, а не HashMap
. Рекомендации по производительности и аргумент конструктора по-прежнему применимы.
Дополнительная литература: тест производительности HashSet и TreeSet
person
durron597
schedule
04.08.2015