1、"==",即全等比较,它判断的是地址是否相等,如果地址相同的话,也就不用比较eqauls了。
2、原始的"equals"是和“==”的完全等同,即Object的equals和“=="完全等同。
3、java se规范约定,如果重写equals方法,那也要重写hashCode方法,使equals为真的情况,hashCode的值也是相同的,此为约定而非强制。
4.对于非hash类型的数据结构,不重写hashcode只重写equals没什么影响。但是对于hash型的数据结构 比如hashset hashmap等之类的必须重写!!!
HashSet
HashTable
HashMap
hashCode
hashCode
equals
hashCode
equals
hashCode
equals
equals
x.equals()
true
y.equals(x)
true
x.equals(y)
true
x.equals(y)
true
y.equals(z)
x.equals(y)
x.equals(null)
false
equals
equals
getClass
if (getClass() != otherObject.getClass())
return false;
如果所有子类都使用同一个 equals,就用 instanceof 检验:
equals
instanceof
if (!(otherObject instanceof ClassName))
return false;
==
equals
Arrays.equals
equals
@Override
hashCode
- String 类的 hashCode 根据其字符串内容,使用算法计算后返回哈希码。
Returns a hash code for this string. The hash code for a String object is computed as s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
- Integer 类返回的哈希码为其包含的整数数值。
Returns: a hash code value for this object, equal to the primitive int value represented by this Integer object.
- Object 类的 hashCode 返回对象的内存地址经过处理后的数值。
Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by HashMap.
在自己的类中想要重写 hashCode
的话一般怎么做呢?建议合理地组合实例域的散列码,让各个不同对象产生的散列码更加均匀。例如我们现在有一个 Cat
对象,它有 name
、size
和 color
三个不同域,那么可以重写 hashCode
方法如下:
class Cat {
......
public int hashCode() {
//hashCode是可以返回负值的
return 6 * name.hashCode()
+ 8 * new Double(size).hashCode()
+ 10 * color.hashCode();
}
......
}
当然还有更好的做法,我们可以直接调用静态方法 Objects.hash
并提供多个参数。这个方法会对各个参数调用 Object.hashCode
,并组合返回的散列码。故以上的方法可以缩写为:
public int hashCode() {
return Objects.hash(name, size, color);
}
注意: equals
与hashCode
的定义必须一致,两个对象equals
为true
,就必须有相同的hashCode
。例如:如果定义的equals
比较的是小猫的 name,那么hashCode
就需要散列该 name,而不是小猫的 color 或 size。