Ceci est étrange. Un collègue a posé des questions sur l'implémentation de myArray.hashCode() dans java. Je pensais que je savais mais ensuite j'ai fait quelques tests. Vérifiez le code ci-dessous. L'étrange pense que j'ai remarqué est que quand j'ai écrit le premier système, les résultats étaient différents. Notez que c'est presque comme si cela rapportait une adresse de mémoire et que la modification de la classe avait déplacé l'adresse ou quelque chose. Je pensais juste partager.Java Array HashCode implémentation
int[] foo = new int[100000];
java.util.Random rand = new java.util.Random();
for(int a = 0; a < foo.length; a++) foo[a] = rand.nextInt();
int[] bar = new int[100000];
int[] baz = new int[100000];
int[] bax = new int[100000];
for(int a = 0; a < foo.length; a++) bar[a] = baz[a] = bax[a] = foo[a];
System.out.println(foo.hashCode() + " ----- " + bar.hashCode() + " ----- " + baz.hashCode() + " ----- " + bax.hashCode());
// returns 4097744 ----- 328041 ----- 2083945 ----- 2438296
// Consistently unless you modify the class. Very weird
// Before adding the comments below it returned this:
// 4177328 ----- 4097744 ----- 328041 ----- 2083945
System.out.println("Equal ?? " +
(java.util.Arrays.equals(foo, bar) && java.util.Arrays.equals(bar, baz) &&
java.util.Arrays.equals(baz, bax) && java.util.Arrays.equals(foo, bax)));
Merci pour cette réponse, mais pourquoi java.lang.Array ne remplace pas les méthodes hashCode (et toString) par défaut? Y a-t-il une bonne raison? –
Parce que hashCode doit être rapide pour être utile (car il est principalement utilisé pour empêcher un appel coûteux de .equals), et même un hashCode de faible valeur sur un tableau peut potentiellement être très lent. Un hashCode qui est fondamentalement aléatoire ne fait pas de mal, il ne fournit aucun avantage. Le moindre de deux maux. – Torque