Я изучал hashcode более подробно и понял, что:
1. Если вы переопределите equals(), вы также должны переопределить hashcode().
2. Чтобы найти, если 2 объекта являются одним и тем же объектом, используйте == operator
Учитывая эти 2 фактора, в Java я предполагал, что когда == operator используется для сравнения , если два экземпляра одинаковы или нет,
if(object1 == object2)
на самом деле делает
if(object1.hashcode() == object2.hashcode())
Но, похоже, я ошибся, выполнив приведенный ниже тест.
public class Main {
    public static void main(String[] args){
        Obj1 one = new Obj1();
        Obj1 two = new Obj1();
        //is this calling hashCode() in backend???
        if(one == two) {
            System.out.println("same");
        }
        else {
            System.out.println("nope");
        }
        //this is of course return true
        if(one == one) {
            System.out.println("one and one is same");
        }
    }
}
class Obj1 {
    @Override
    public int hashCode() {
        System.out.println("hashCode() is called");
        return 111;
    }
    @Override
    public boolean equals(Object another) {
        System.out.println("equals() is called");
        return false;
    }
}
В соответствии с тестом, который использует == operator, и посмотрите, вызывается ли equals(), и это не так.
Итак, мой вопрос: если == operator может использоваться для сравнения, если объект тот же или нет, какова точка переопределения методов e quals() и hashCode() для сравнения? Разве не == operator выполняет работу?
ссылка:
Переопределение hashCode() - это достаточно хорошо?
http://mindprod.com/jgloss/hashcode.html
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object)
