UnifiedMap: как это работает?

Eclipse Collections поставляется с собственными реализациями List, Set и Map. Он также имеет дополнительные структуры данных, такие как Multimap, Bag и целую иерархию примитивных коллекций. В этом блоге мы заглянем под капот UnifiedMap.

UnifiedMap

UnifiedMap - это реализация Map для коллекций Eclipse, которая реализована совсем не так, как JDK HashMap.

java.util.HashMap поддерживается таблицей объектов Entry. Реализация Entry в HashMap имеет hashcode, key, value, next в качестве членов, HashMap по существу кэширует хэш-код ключей.

UnifiedMap поддерживается массивом, в котором ключи и значения занимают альтернативные места в массиве: protected transient Object[] table. Структура плоского массива хранит там только ключи и значения, создавая более компактную реализацию Map с уменьшенным объемом памяти. Дополнительным преимуществом наличия ключей и значений в последовательных слотах является улучшенная локальность кеша.

Коллизии в основном массиве обрабатываются путем помещения специального объекта с именем CHAINED_KEY в ключевой слот. Слот значений CHAINED_KEY (слот после CHAINED_KEY слота) содержит другой массив Object[], аналогичный основному массиву с именем CHAINED_OBJECT, с ключами и значениями в альтернативных слотах.

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

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

Ниже приведены несколько сравнений памяти и производительности между JDK 1.8 HashMap и Eclipse Collections 9.0.0 UnifiedMap.

Объем памяти (чем меньше число, тем лучше)

Тесты производительности (чем больше число, тем лучше)

Исходный код для тестов памяти и тестов производительности доступен на GitHub.

Резюме. Коллекции Eclipse UnifiedMap занимает примерно на 50% меньше памяти по сравнению с JDK HashMap, но это оказывает незначительное влияние на производительность.

Коллекции Eclipse открыты для взносов. Если вам нравится, пометьте его.