hashcade和equals哪个先执行

2024-12-03 02:41:11
推荐回答(2个)
回答1:

完全取决于对象的使用者。
比如,HashSet是它的元素的使用者,HashSet的contains方法,就是先执行hashCode,定位到bucket,然后对这个bucket里的元素依次调用equals方法。
同时,你完全可以自己实现一个XXSet类,对这个类的contains方法,你可以完全不执行hashCode,直接全遍历所有元素并调用equals方法,然后再调用hashCode方法比较结果是否一致。当然这样做很扯蛋,因为equals成立而hashCodeI不相同的实现方式是扯蛋的,但没有从语法级别上不允许这样做。这里只是举例说明哪个先执行以及是否要执行都取决于使用者。对类而言,实现它们即可。

回答2:

public class Demo
{
@Override
public int hashCode()
{
System.out.println("-hashCode-");
return super.hashCode();
}

@Override
public boolean equals(Object obj)
{
System.out.println("+equals+");
return super.equals(obj);
}

public static void main(String[] args)
{
Demo obj1 = new Demo();
Demo obj2 = new Demo();
System.out.println(obj1.equals(obj2) + ""); // equals方法不会调hashCode
System.out.println((obj1==obj2) + "");
System.out.println(obj1 + ""); //只有调toString()方法时才会调hashCode
}
}