Идентичность объекта и равенство в 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 Метод для каждого элемента в массиве и будет возвращать результат на основе их равенства.

Другие вопросы по тегам