Хорошо, я получил известие от многих мест и источников, что каждый раз, когда я переопределяю равняние () метод, я должен переопределить хэш-код () метод также. Но рассмотрите следующую часть кода
package test;
public class MyCustomObject {
int intVal1;
int intVal2;
public MyCustomObject(int val1, int val2){
intVal1 = val1;
intVal2 = val2;
}
public boolean equals(Object obj){
return (((MyCustomObject)obj).intVal1 == this.intVal1) &&
(((MyCustomObject)obj).intVal2 == this.intVal2);
}
public static void main(String a[]){
MyCustomObject m1 = new MyCustomObject(3,5);
MyCustomObject m2 = new MyCustomObject(3,5);
MyCustomObject m3 = new MyCustomObject(4,5);
System.out.println(m1.equals(m2));
System.out.println(m1.equals(m3));
}
}
Здесь вывод является верным, ложным точно способ, которым я хочу, чтобы он был, и я не забочусь переопределения хэш-кода () о методе вообще. Это означает, что хэш-код () переопределение является опцией, довольно бывшей обязательной, как все говорят.
Я хочу второе подтверждение.
Это работает для вас, потому что ваш код не использует никаких функций (HashMap, HashTable), которым требуется hashCode ()
API .
Однако вы не знаете, будет ли позже вызван ваш класс (предположительно не написанный как одноразовый) в коде, который действительно использует свои объекты в качестве хеш-ключа, и в этом случае это повлияет на ситуацию.
Согласно документации для класса Object :
Общий контракт hashCode:
Каждый раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java, Метод hashCode должен последовательно возвращать одно и то же целое число при условии, что никакая информация, используемая в равных сравнениях объекта, не изменена. Это целое число не обязательно должно оставаться согласованным от одного выполнения приложения к другому выполнению того же самого приложения.
Если два объекта равны согласно методу equals (Object), то вызов метода hashCode для каждого из двух объектов должен привести к одинаковому целочисленному результату .
Потому что HashMap / Hashtable сначала будет искать объект с помощью hashCode ().
Если они не совпадают, hashmap будет утверждать, что объекты не совпадают, и возврат не существует на карте.
Причина, по которой вам нужно @Override
ни то, ни другое, заключается в том, как они взаимосвязаны с остальной частью API.
Вы обнаружите, что если вы поместите m1
в HashSet
, тогда не будет содержать (m2)
. Это непоследовательное поведение , которое может вызвать множество ошибок и хаос.
Библиотека Java имеет множество функций. Чтобы заставить их работать для вас , вам нужно играть по правилам, и убедитесь, что равняется
, а hashCode
согласован - это одна из самых важных единицы.