Récemment, dans une interview, on m'a demandé ce qu'est exactement un seau dans hashmap? Que ce soit un tableau ou un arraylist ou quoi?
Je me suis confus. Je sais que hashmaps est soutenu par des tableaux. Je peux donc dire que ce compartiment est un tableau d’une capacité de 16 personnes au début, qui stocke des codes de hachage et vers lequel les listes liées ont leur pointeur de départ
Je sais comment un hashmap fonctionne en interne, je voulais juste savoir ce qu'est exactement un seau en termes de structures de données.
Non, un compartiment correspond à chaque élément du tableau auquel vous faites référence. Dans les versions antérieures de Java, chaque compartiment contenait une liste liée d'entrées de carte. Dans les nouvelles versions de Java, chaque compartiment contient soit une arborescence d'entrées, soit une liste d'entrées liée.
D'après les notes d'implémentation dans 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.
...
Buckets exactement est un tableau de nœuds. Donc, un compartiment unique est une instance de la classe Java.util.HashMap.Node. Chaque nœud est une structure de données similaire à LinkedList, ou peut ressembler à un TreeMap (depuis Java 8), HashMap décide lui-même de ce qui est le mieux pour les performances: conservez les compartiments sous la forme LinkedList ou TreeMap. TreeMap sera uniquement choisi en cas de mauvaise conception de la fonction hashCode (), lorsque de nombreuses entrées seront placées dans un seul compartiment ... Voir à quoi ressemblent les compartiments dans 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;
Les compartiments sont essentiellement une structure de données utilisée dans l'algorithme de pagination du système d'exploitation. Être dans une langue très Laymans.
Les objets représentant un hashcode particulier sont stockés dans ce compartiment (vous pouvez en principe considérer l'en-tête de la structure de données de la liste liée comme la valeur du hashcode représentée dans les termes du compartiment)
Les références de l'objet sont stockées dans la liste de liens, dont l'en-tête représente la valeur du Hashcode.
La JVM les crée et leur taille dépend de la mémoire allouée par la JVM.