Как коллекции Trove более эффективны, чем стандартные коллекции Java?

недавно в интервью меня спросили о том, как работает HashMap на Java, и я смог хорошо объяснить это и объяснить, что в худшем случае HashMap может выродиться в список из-за цепочки. Меня попросили найти способ улучшить эту производительность, но я не смог этого сделать во время интервью. Интервьюер попросил меня посмотреть "клад".

Мне кажется, он указывал на на этой странице. Я прочитал описание, приведенное на этой странице, но все же не могу понять, как он преодолевает ограничения java.утиль.Хранилище HashMap.

даже намек был бы оценен. Спасибо!!

3 ответов


ключевая фраза здесь открыть решении. Вместо хэширования в массиве ведер все записи находятся в одном большом массиве. Когда вы добавляете элемент, если пространство для него уже используется, вы просто перемещаетесь вниз по массиву, чтобы найти свободное пространство.

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

однако он по-прежнему имеет наихудшее линейное поведение, если (скажем) каждый ключ хэширует одно и то же значение, поэтому он не избегает этой проблемы.


Мне кажется со страницы Trove, что есть два основных отличия, которые улучшают производительность.

первым является использование открытой адресации (http://en.wikipedia.org/wiki/Hash_table#Open_addressing). Это не устраняет проблему столкновения, но это означает, что нет необходимости создавать объекты "запись" для каждого элемента, который идет на карте.

вторым важным отличием является возможность предоставить свою собственную хэш-функцию, которая отличается от того, который предоставлен классом ключей. Таким образом, вы можете предоставить гораздо более быструю хэш-функцию, если это имеет смысл.


одним из преимуществ Trove является то, что он избегает создания объектов, особенно для примитивов. Для больших хэш-таблиц во встроенном устройстве java это может быть выгодно из-за меньшего потребления памяти.

другим преимуществом, которое я видел, является использование пользовательских хэш-кодов / функций без необходимости переопределения hashcode (). Для конкретного набора данных и эксперта по написанию хэш-функций это может быть преимуществом.