==
==对于基本类型而言比较的的是值是否相等,对于引用类型比较的是对象所在堆中的地址是否相同。
equals
equals比较的是值是否相等;比如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;
}
首先用到了==比较地址是否相同,地址不相同的话比较值是否相同;
hashcode
场景:想把自定义的类作为key加入哈希表的时候,要把这个类的hashCode和equals方法重写。
哈希表的存储结构就是想要把具有相同key值的数据保存在同一个链表中,再通过equals方法确定具体是哪个值,找到value。
如果不重写hashCode方法,默认使用Object的hashCode的方法,hashCode返回的值是对象的地址,所有如果两个对象定义的变量都相等,使用hashCode方法应该返回同样的值。
如果不重写的话,只能通过同一个对象才能获取到value的值。
下面就是根据对象的name和tmp值来实现hashCode方法,返回hash值:
没有重写hashCode:
重写hashCode: