解释是这样的,当你往集合中添加第一个元素的时候,(不管你重写不重写)集合都会自动调用hasCode方法,算出一个哈希值
当你再往集合中添加元素时。系统会再算出此元素的哈希值,并自动判断跟之前元素的哈希值是否相同。如果相同,就需要equals方法,来判断元素的属性是否都一样。
给你举个例子
元素要往哈希表结构的容器中存储,必须具备hashCode和equals方法。(Object已经提供了这两个方法。 对象创建在堆内存中就是因为有了hashCode方法.)
//覆写hashCode方法的原因。Object中的hashCode是本地(windows)方法,只算内存地址.
//不覆写会根据内存地址判断资料相同的人不是同一个人。
//满足不了人的姓名和年龄相同 既为同一个人的要求。所以要依据对象自身特别不同。
//覆写equals的原因:HashSet判断元素唯一的依据是自动调用equals方法。
//不覆写的话,如果hash值万一相同的话,就需要逐个比较元素的属性,而原来的equals满足不了这个要求
代码如下:
@Override
// 覆写hashCode方法的原因。Object中的hashCode是本地(windows)方法,只算内存地址.
// 不覆写会根据内存地址判断资料相同的人不是同一个人。
// 满足不了 人的姓名和年龄相同 既为同一个人的要求。所以要依据对象自身特别不同。
public int hashCode() {
final int prime = 31;
return name.hashCode() + age * prime;
// *prime的原因。防止姓名的哈希值是40,年龄是20 与姓名的哈希值是20,年龄是40 。而引起哈希值相同,多运行equals方法
}
@Override
// 覆写equals的原因:HashSet判断元素唯一的依据是自动调用equals方法。
// 不覆写的话,如果hash值万一相同的话,就需要逐个比较元素的属性,而原来的equals满足不了这个要求,
//如果主方法中添加的元素内容不是一模一样的,几乎不可能调用equals方法。
|