Это странно. Сотрудник спросил о реализации myArray.hashCode() в java. Я думал, что знаю, но потом я провел несколько тестов. Проверьте код ниже. Странное мнение, что я заметил, это то, что когда я написал первый синус, результаты были разными. Обратите внимание, что это почти так, как будто он сообщает адрес памяти, и изменение класса переместило адрес или что-то в этом роде. Просто подумал, что я поделюсь.Реализация Java Array HashCode
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)));
Спасибо за этот ответ, но почему java.lang.Array по умолчанию не переопределяет методы hashCode (и toString)? Есть ли веская причина? –
Поскольку hashCode должен быть быстрым, чтобы быть полезным (поскольку он в основном используется для предотвращения дорогостоящего вызова .equals), и даже hashCode на мелком значении массива может потенциально быть очень медленным. Хэш-код, который в основном случайный, не болит, он просто не дает никакого преимущества. Меньше двух зол. – Torque