参考 https://blog.csdn.net/lijiecao0226/article/details/24609559
equals
equals 从 Object 来说 就是 ==
比较 两个对象的内存地址
这是Object的 equals 方法
public boolean equals(Object obj) {
return (this == obj);
}
这是String 的equals 方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
从上面的代码中可以看出 String的equals
是先比较 两个String是否相等==
如果两个String == 那么 这两个字符串则是引用的同一个对象 则这两个字符串是相等的
如果不相等 然后比较String 中的每一个char 字符是否相等
如果要根据两个属性来判断两个对象的是否相等 则要像String 一样去重写 equals 方法
hashCode
在Java中任何一个对象都具备equals(Object obj)和hashCode()这两个方法,因为他们是在Object类中定义的。 equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。 hashCode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。
总结
1.若重写了equals(Object obj)方法,则有必要重写hashCode()方法。
2.若两个对象equals(Object obj)返回true,则hashCode()有必要也返回相同的int数。
3.若两个对象equals(Object obj)返回false,则hashCode()不一定返回不同的int数。
4.若两个对象hashCode()返回相同int数,则equals(Object obj)不一定返回true。
5.若两个对象hashCode()返回不同int数,则equals(Object obj)一定返回false。
6.同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题。