一、equals的作用
equals是Object类的方法,所以所有的类都会有这个方法。Object中,equals的实现是这样的
public boolean equals(Object obj) { return (this == obj); }
这个方法实际上是等价于==的,也就是只有当两个对象的地址相同(即为同一个对象)时,才会返回true。
所以我们通常情况下会重写equals方法,当两个对象的值相等时,便会返回true。
二、hashcode的作用
hashcode是Object中的native方法,作用是根据对象标识信息计算出int类型的哈希值,用于在对应的散列表中确认key是否一致
public native int hashCode();
当两个对象的地址相同(即为同一个对象)时,计算出的哈希值是相同的,但是哈希值相同并不能代表两个对象的地址相同。
三、hashcode相等两个类一定相等吗?equals呢?相反呢?(相等的意思是值相等)
- hashcode方法和equals方法没有重写时
- hashcode相等两个类不一定相等
- equals返回true的两个类一定相等(为同一个对象)
- 两个类相等hashcode不一定相等
- 两个类相等equals不一定返回true
- hashcode方法和equals方法均已按规范重写时
- hashcode相等两个类不一定相等(存在哈希冲突)
- equals返回true的两个类一定相等
- 两个类相等hashcode一定相等
- 两个类相等equals一定返回true
最后,附上java对重写equals方法的要求
1. 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"。 2. 反射性:x.equals(x)必须返回是"true"。 3. 类推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"。 4. 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"。 5. 非空性,x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"。