equals 介绍
equals 本质上就是 ==,因为很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等
源码:
//没有重写equals方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
//重写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介绍
hashcode通俗的来讲就是对象在hash表中有对应的位置,返回值位int类型,主要是为了查找的快捷性。
常见的String重写了该方法,如果没有重写该方法默认返回的是对象的内存地址,由于String重写了hashCode采用的算法,所以是会出现两个不同对象hashCode相同的情况的,这一现象也可被称为hash冲突。为了避免这一情况,所以重写了equals方法则必定要重写hashCode方法。
源码:
//没有重写
public native int hashCode();
//String重写hashCode
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
区别
- equals 返回布尔类型,hashcode返回int类型
- equals重在比较,hashcode重在返回对象在hash表的位置
- 默认的hashcode方法返回值永远大于等于0,默认的equals方法实际上就是"=="的比较
联系
- 重写equals 方法之后,也要重写hashcode方法
- equals结果如果是相同,那么hashcode也一定相同,反之hashcode相同但equals不一定相同
- 实际应用中可以根据情况重写相关代码,减少equals次数,以提升代码效率