Java écrase toujours le code de hachage lors de l'écrasement égal
Récemment, j'ai appris la connaissance de base de Java. Lorsque je rencontre des égaux de couverture Java, j'ai toujours beaucoup de questions lorsque je dois écraser HashCode. Après avoir directement discuté avec mes collègues et interrogé les informations en ligne, je vais le trier ici pour aider tout le monde à le comprendre et il y a des instructions dans le code.
Code d'implémentation spécifique:
package cn.xf.cp.ch02.item9; import java.util.hashmap; import java.util.map; classe publique phonenumber {private final short areacode; Préfixe court final privé; Coupon de linge court final privé; Public Phonenumber (Int Areacode, int Prefix, int lineNumber) {rangeCheck (Areacode, 999, "Code Area"); Rangcheck (Prefix, 999, "Prefix"); rangcheck (line de line, 9999, "numéro de ligne"); this.ARACODE = (Short) Areacode; this.prefix = (court) préfixe; this.lineNumber = (court) LineNumber; } private static void Rangcheck (int arg, int max, name de chaîne) {if (arg <0 || arg> max) lancez new illégalargumentException (nom + ":" + arg); } @Override public booléan equals (objet o) {if (o == this) return true; if (! (o instanceof phonenumber)) renvoie false; Phonenumber pn = (phonenumber) o; return pn.lineNumber == lineNumber && pn.prefix == Prefix && pn.Areacode == Areacode; } / * @Override // Quant à la raison pour laquelle 31 est utilisé, c'est la valeur recommandée. Des études ont montré que ce nombre fonctionne mieux lorsqu'il est utilisé public int hashCode () {int result = 17; Résultat = 31 * Résultat + AreaCode; Résultat = 31 * Résultat + Prefix; Résultat = 31 * Résultat + LineNumber; Résultat de retour; } * / // Si un objet ne change pas fréquemment et a une surcharge élevée, vous devriez considérer le cache de code de hachage à l'intérieur des variables d'objet // modifiées avec volatile, le thread lira la valeur la plus modifiée de la variable chaque fois qu'elle utilise la variable. Int de hashcode privé volatile; @Override public int hashcode () {int result = hashcode; if (result == 0) {result = 17; Résultat = 31 * Résultat + AreaCode; Résultat = 31 * Résultat + Prefix; Résultat = 31 * Résultat + LineNumber; hashCode = résultat; } Retour Résultat; } public static void main (string [] args) {map <phonenumber, string> m = new hashmap <phonenumber, string> (); m.put (New Phonenumber (707, 867, 5309), "Jenny"); // Jenny ne sera pas retourné ici, il reviendra NULL, car ils mettent des objets dans différents buckets de hachage System.out.println (m.get (New Phonenumber (707, 867, 5309))); }}Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!