Идентичность объекта и равенство в Java
Пожалуйста, взгляните на 2 примера ниже:
String a = new String("hello");
String b = new String("hello");
System.out.println("a.hashCode() - " + a.hashCode());
System.out.println("b.hashCode() - " + b.hashCode());
System.out.println("a == b - " + (a == b));
System.out.println("a.equals(b) - " + (a.equals(b)));
Результат:
a.hashCode() - 99162322
b.hashCode() - 99162322
a == b - false
a.equals(b) - true
Если я правильно понимаю, у меня есть 2 разных объекта, так как слово new создает объект. Но мы видим, что хэш-код тот же, что означает, что я был неправ. Если hashCode такой же, я понимаю, почему a.equals(b)
это правда.
Однако вывод этого кода:
int [] a = {1, 2, 3};
int [] b = {1, 2, 3};
System.out.println("a.hashCode() - " + a.hashCode());
System.out.println("b.hashCode() - " + b.hashCode());
System.out.println("a == b - " + (a == b));
System.out.println("a.equals(b) - " + (a.equals(b)));
это отличается:
a.hashCode() - 1627674070
b.hashCode() - 1360875712
a == b - false
a.equals(b) - false
Теперь у нас есть два разных объекта, потому что хэш-код отличается, и поэтому оба условия ложны (что и должно быть).
Чувствуется, что мне нужно заполнить пробел в знаниях и буду признателен за любые рекомендации.
Заранее спасибо!
1 ответ
Возникающая здесь проблема заключается в вашем понимании hashCode
-метод и тому equals
метод для массивов.
hashCode
метод можно найти в Object
и создаст хеш на основе ссылки на объекты.
String
класс переопределяет этот метод своей собственной логикой, основанной на вычислениях, выполненных на char
с String
(точнее он вычисляет хеш по формуле s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]
где s[i]
это i
персонаж String
). Это означает, что для 2 Strings
тот equal
друг с другом вы всегда получите тот же результат, позвонив hashCode
,
int[]
вместо этого использует реализацию в Object
поэтому создаем хеш из ссылки на объект. Это означает, что для 2 массивов с одинаковыми значениями вы все равно получите другой результат, вызвав hashCode
,
Также для сравнения значений двух массивов используйте Arrays.equals
как зовет int[].equals
так же, как использование ==
оператор, который идет - еще раз - для сравнения ссылок. Arrays.equals
вместо этого вызывает equals
Метод для каждого элемента в массиве и будет возвращать результат на основе их равенства.