环境为eclipse/Myeclipse
如果是自己写的类,一般需要重写hashCode()和equals()方法,用eclipse/Myeclipse可以自动生成,
快捷键Alt+Shift+S
选择我选中的这个
勾选参数后,点击OK,就生成啦
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
比较对象是否相同时,会先比较他们的hashCode,如果相同,才会调用equals。
计算hashCode时为什么选择31呢?
* 1.31是一个质数,质数是能被1和自己本身整除的数
* 2.31这个数既不大也不小
* 3.31这个数好算,2的五次方-1,2向左移动5位
equals方法重写的详细解释
@Override
public boolean equals(Object obj) {
if (this == obj) //调用的对象和传入的对象是同一个对象
return true; //直接返回true
if (obj == null) //传入的对象为null
return false; //返回false
if (getClass() != obj.getClass()) //判断两个对象对应的字节码文件是否是同一个字节码
return false; //如果不是直接返回false
Person other = (Person) obj; //向下转型
if (age != other.age) //调用对象的年龄不等于传入对象的年龄
return false; //返回false
if (name == null) { //调用对象的姓名为null
if (other.name != null) //传入对象的姓名不为null
return false; //返回false
} else if (!name.equals(other.name)) //调用对象的姓名不等于传入对象的姓名
return false; //返回false
return true; //返回true
}