# Object
# equals 方法
equals() 与 ==
在面试中面试官经常会问 equals() 方法和 == 运算符的区别,== 运算符用于比较基本类型的值是否相同而 equals 用于比较两个对象是否相等,那么有个问题来了,两个对象怎么才算是相等的呢。
看 object 中的 equals 实现
public boolean equals(Object obj) {
return (this == obj);
}
1
2
3
2
3
在Object中equals和==是等价的。所以在 Object 中两个对象的引用相同,那么一定就是相同的。在我们自定义对象的时候一定要重写 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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 重写equals时,一定要重写hashCode方法
WARNING
equals在内部调用"==",在不重写equals方法时,equals方法是比较两个对象是否具有相同的引用,即是否指向了同一个内存地址。而hashCode是一个本地方法,它返回的是这个对象的内存地址。
当重写equals方法时,就必须重写hashCode方法,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashCode值来进行判断是否相同的。
这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但 不重写hashCode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashCode却是不一样的,由此将产生了不一致。