Apprenez HashSet et HashTable à partir du code source JDK

HashSet

Il existe trois types de collections en Java, l'un est List, l'autre est Queue et l'autre Set. Les éléments des deux premiers ensembles sont ordonnés et les éléments peuvent être répétés; les éléments du dernier ensemble ne sont pas ordonnés, mais les éléments ne sont pas reproductibles.

Ensemble:

1. Utilisé pour stocker des éléments non ordonnés (l'ordre de dépôt et de récupération n'est pas nécessairement le même), la valeur ne peut pas être répétée

2. L'essence de l'égalité d'objet est la valeur de hashCode de l'objet (java est calculé en fonction de l'adresse mémoire de l'objet, le code de hachage des différents objets n'est pas nécessairement différent), si vous voulez que deux objets différents soient considérés comme égaux , Vous devez remplacer la méthode hashCode d'Object et la méthode equals. Par exemple, la classe de chaîne réécrit la méthode hashcode. La valeur de code de hachage calculée n'est pas l'adresse mémoire réelle de l'objet et est également réécrite.

String.hashcode ()

 String.equals

1. Vérifiez d'abord s'il s'agit du même objet

2. Vérifiez s'il s'agit du même type (String), puis vérifiez que les valeurs sont égales

Hashset prend également en charge la sérialisation, la copie superficielle

Hashset est toujours Hashset en interne, mais ce n'est plus une paire clé-valeur qui est directement ajoutée en appelant son add

Regardez sa méthode d'ajout:

Appelez directement map.put pour mettre la clé représentée par e et présenter les variables membres

La carte ici est la structure de la valeur stockée dans le hashset. Vous pouvez voir que la clé est placée, et la valeur correspondant à la clé est une instance d'objet

 

Puisque son hashmap est utilisé, sa méthode de construction est en fait de définir hashmap, donc ce sont les quatre méthodes de construction de hashmap

Ensuite, la valeur n'est pas aussi pratique que hashmap. Vous pouvez directement prendre la valeur correspondant à une clé. Prendre la valeur dans le hashset, c'est obtenir un itérateur, obtenir toutes les clés du hashmap interne, puis parcourir l'opération.

 Ainsi, la structure de stockage interne est la même que la structure de hachage, et le hachage est également non sécurisé pour les threads

La différence entre ArrayList et HashSet

1. Le premier est ordonné et peut stocker des valeurs en double, le second n'est pas ordonné et ne peut pas stocker de valeurs en double, car la clé de hachage ne peut pas être répétée

2. Arraylist est rempli et développé par 1,5 fois, le mécanisme d'expansion Hashset est le même que hashmap

HashTable

L'interface de carte implémentée par HashTable prend en charge la sérialisation et la copie superficielle

Hashtable est également une table de hachage implémentée par la "méthode de fermeture à glissière" (juste un tableau plus une seule liste liée). Sa structure de stockage interne est un tableau d'entrée. Similaire à hashmap, il a également un facteur de charge et une capacité initiale.

Il existe également 4 types de méthodes de construction

Le premier prend en charge la capacité et le facteur de charge initiaux spécifiés comme suit: à ce moment, l'espace mémoire sera alloué à l'entrée, et le seuil d'initialisation est la capacité initiale et la plus petite de (2 fois 31 fois-1) -8 (nombre maximal d'octets) +1 Valeur

 

Le deuxième type spécifie uniquement la taille d'initialisation

 

Le troisième utilise la capacité initiale et le facteur de charge par défaut, la capacité initiale est de 11

 

 

Le quatrième type consiste à y placer directement une carte pour initialiser une table de hachage. À ce stade, la capacité de la table de hachage deviendra 2 fois le nombre de paires clé-valeur de la carte et la plus grande valeur de la capacité par défaut, puis la carte Mettez dedans

 

 

La table de hachage ici est différente de la table de hachage. Le nombre de clés / facteur de charge + 0,75 de la carte est utilisé lors de l'initialisation, et la valeur calculée est comparée à la 30e puissance de 2, et la plus petite des deux et le seuil sont utilisés. Comparez et affectez une valeur de seuil à la puissance de 2 supérieure à la valeur calculée à la valeur la plus proche, ce qui est pratique pour une expansion de redimensionnement ultérieure, puis les valeurs de la carte sont séquentiellement passées par le round-robin.

 

Comparaison de HashTable et HashMap

1. HashTable est basé sur la classe Dictionary et HashMap est basé sur AbstractMap. Dictionary est une classe parent abstraite de toute classe qui peut mapper des clés aux valeurs correspondantes. AbstractMap est une implémentation basée sur l'interface Map, mais les tables de hachage et hashmap implémentent l'interface Map

2. Hashmap peut mettre la valeur de la clé et la valeur est nulle, mais vous ne pouvez mettre qu'une de ces valeurs, donc la table de hachage pour déterminer s'il existe une certaine clé à utiliser contient la clé (la clé doit être unique), ne pas obtenir , La valeur correspondant à plusieurs clés est donc nulle, et la clé et la valeur de la table de hachage ne peuvent pas être nulles, sinon une erreur de pointeur nul sera signalée

Traitement Hashmap:

Par conséquent, le hashmap prend en compte un tel cas où la clé est nulle, de sorte que son hachage est calculé comme 0, et la clé qui n'est pas nulle appelle ensuite la méthode hashcode de l'objet pour calculer le hachage

La méthode get de hashmap est comme indiqué dans la figure suivante. Si elle n'existe pas, elle peut retourner null ou la valeur de la clé est null, ce qui ne peut pas être déterminé.

Traitement de table de hachage:

La conception de la table de hachage ne prend pas beaucoup en compte, mais appelle directement le code de hachage de sa clé, puis null.hashcode signalera définitivement une erreur

 

Hashtable détectera si la valeur correspondant à la clé de mise est nulle

 

 

3. Hashmap n'est pas thread-safe par défaut, et hashtable pense que les méthodes publiques de base sont toutes décorées avec synchronized, donc il est synchronisé

4. Les deux méthodes d'expansion sont différentes. L'expansion de Hashmap est la méthode de redimensionnement, la capacité devient ancienne * 2 et la table de hachage est la méthode de rehash, la capacité devient ancienne * 2 + 1,

5. Les deux implémentations de traversée interne sont différentes:

Traversée de la valeur de clé Hashmap en tant qu'itérateur

 

La traversée de la valeur de la clé de la table de hachage est Enumerator

 

 6. La méthode pour obtenir la position de la clé est différente:

Dans la table de hachage, l'opération logique est d'abord remplacée par une logique ET pour accélérer, la nième puissance de 2 -1 bits tous les 1 bit binaire, puis le hachage de la clé et la position de la valeur de clé sont calculés, et la valeur de hachage n'est pas un simple code de hachage Les 16 bits de poids fort du code de hachage de la clé sont utilisés pour le fonctionnement XOR

 

 

 

 Hashtable calcule un code de hachage directement en fonction de la clé (peut être une valeur négative), puis calcule la valeur positive avec la 31e puissance de 2 -1, puis modulo la longueur de la table de hachage actuelle, puis détermine la position de la paire clé-valeur, puis L'efficacité du module n'est certainement pas supérieure à l'efficacité de fonctionnement de la logique

 

Référence

https://blog.csdn.net/fujiakai/article/details/51585767 La  différence entre hashmap et hashtable

https://wiki.jikexueyuan.com/project/java-collection/hashtable.html  principe de mise en œuvre de la table de hachage

Je suppose que tu aimes

Origine www.cnblogs.com/tr1ple/p/12701149.html
conseillé
Classement