Что такое 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.
 ...

bucket

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


ведра ровно - это массив узлов. Таким образом, 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.