Методы используются для сравнения объектов. Их необходимо переопределять во вновь созданных классах. Метод equals() в изначальном виде просто сравнивает ссылки:
public boolean equals(Object obj) { return (this == obj); }
Создатели Java возложили полную ответственность на разработчиков, так как именно создатель класса знает как правильно сравнить его объекты. Метод возвращает true в случае, если объекты идентичны. Иначе false.
public class EqualsTest{ public static void main(String[] args) { Object o1 = new Object(); Object o2 = new Object(); System.out.println(o1.equals(o2)); o2=o1; System.out.println(o1.equals(o2)); String s1 = new String("TestString"); String s2 = new String("TestString"); System.out.println(s1==s2); System.out.println(s1.equals(s2)); } } Вывод: false true false true
Метод hashCode() возвращает целое значение, основываясь на полях объекта. У метода существует контракт:
1. При повторном вызове (при условии что состояние объекта не менялось) hashCode() возвращает одно и то же значение. Но в различных приложениях хэшкоды одинаковых объектов могут различаться.
public class TestHashCode{ public static void main(String[] args) { String s1 = new String("testString"); System.out.println(s1.hashCode()); } } Вывод: 1727748931
2. Два объекта, для которых equals() возвращает true, имеют одинаковый хэшкод.
public class TestHashCode{ public static void main(String[] args) { String s1 = new String("testString"); String s2 = new String("testString"); System.out.println(s1==s2); System.out.println(s1.equals(s2)); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); } } Вывод: false true 1727748931 1727748931
3. Не обязательно, что у разных объектов разные хэшкоды.
Комментарии: