# Object

返回:源码

# equals 方法

equals() 与 ==

在面试中面试官经常会问 equals() 方法和 == 运算符的区别,== 运算符用于比较基本类型的值是否相同而 equals 用于比较两个对象是否相等,那么有个问题来了,两个对象怎么才算是相等的呢。

看 object 中的 equals 实现

public boolean equals(Object obj) {
 return (this == obj);
}
1
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

# 重写equals时,一定要重写hashCode方法

WARNING

equals在内部调用"==",在不重写equals方法时,equals方法是比较两个对象是否具有相同的引用,即是否指向了同一个内存地址。而hashCode是一个本地方法,它返回的是这个对象的内存地址。
当重写equals方法时,就必须重写hashCode方法,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashCode值来进行判断是否相同的。
这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但 不重写hashCode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashCode却是不一样的,由此将产生了不一致。