hashCode()方法和equals()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致。
.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
.hashCode()相等的两个对象他们的equals()不一定相等,也就是hashCode()不是绝对可靠的。
hashCode()和equals()一样都是基本类Object里的方法。Object里hashCode()里面只是返回当前对象的地址。
相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的hashCode()不同,
只要重写 equals,就必须重写 hashCode;
因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法;
如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals;
String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作为 key 来使用;
2、什么时候需要重写?
一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode。
3、那么为什么要重载hashCode呢?
如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。
网友评论