Что такое bucket в hashmap?
недавно в интервью меня спросили, Что такое ведро в hashmap? Является ли это массивом или arraylist или что?
Я запутался. Я знаю, что хэш-карты поддерживаются массивами. Итак, могу ли я сказать, что bucket-это массив с емкостью 16 в начале хранения хэш-кодов и на который связанные списки имеют свой начальный указатель ?
Я знаю, как работает HashMap внутренне, просто хотел знать, что такое ведро с точки зрения структур данных.
4 ответов
нет, ведро-это каждый элемент массива, на который вы ссылаетесь. В более ранних версиях Java каждое ведро содержало связанный список записей карты. В новых версиях Java каждое ведро содержит древовидную структуру записей или связанный список записей.
из примечаний к реализации в Java 8:
/*
* Implementation notes.
*
* This map usually acts as a binned (bucketed) hash table, but
* when bins get too large, they are transformed into bins of
* TreeNodes, each structured similarly to those in
* java.util.TreeMap. Most methods try to use normal bins, but
* relay to TreeNode methods when applicable (simply by checking
* instanceof a node). Bins of TreeNodes may be traversed and
* used like any others, but additionally support faster lookup
* when overpopulated. However, since the vast majority of bins in
* normal use are not overpopulated, checking for existence of
* tree bins may be delayed in the course of table methods.
...
ведра ровно - это массив узлов. Таким образом, single bucket является экземпляром класса java.утиль.Хранилище HashMap.Узел. Каждый узел является структурой данных, подобной LinkedList, или может быть похож на TreeMap (начиная с Java 8), HashMap решает сам, что лучше для производительности-сохранить ведра как LinkedList или TreeMap. TreeMap будет выбран только в случае плохо разработанной функции hashCode (), когда множество записей будет размещено в одном ведре. Посмотрите, как выглядят ведра в Хранилище HashMap:
/**
* The table, initialized on first use, and resized as
* necessary. When allocated, length is always a power of two.
* (We also tolerate length zero in some operations to allow
* bootstrapping mechanics that are currently not needed.)
*/
transient Node<K,V>[] table;
ведра, в основном структура данных, которая используется в алгоритме подкачки операционной системы . Быть на очень мирском языке.
объекты, представляющие определенный хэш-код, хранятся в этом ведре.(в основном вы можете рассматривать заголовок структуры данных связанного списка как значение хэш-кода, которое представлено в терминах bucket)
ссылки на объект сохраняются в списке ссылок, заголовок которого представляет значение хэш-кода.
JVM создает их и размер, зависит от памяти, выделяемой JVM.