我们先上结论喽:
==
要求比较严格,要求两个对象必须是同一个对象;equals
方法,判断完了是否是同一个对象,会继续判断两个对象的值是否相同,他的要求没那么严格,只要值相同,就好了。
文章目录
1、背景
今儿看了一个
Java
的.class
文件,
发现for
循环中有个++i
,
于是就去查了下,
Java
是用什么语言编写的,
得到的答案是,
Java
的虚拟机是使用C
语言和汇编编写的,
上层是用Java
语言本身,
然后又看了一下那个.class
文件,
忽然一拍脑门,
Java
本来就有前置自增啊!!!!
为什么会有去查“Java
是用什么语言编写的”这个问题的冲动呢?
潜意识中,觉着前置自增是C
语言或者C++
语言才有的,
后面,垂死病中惊坐起,
卧槽,我大Java
语言本来就有前置自增!
下面贴一下那个.class
文件中的代码:
// 以下equals方法,出自 openjdk1.8.0.41
// openjdk version "1.8.0_41"
// OpenJDK Runtime Environment (build 1.8.0_41-b04)
// OpenJDK 64-Bit Server VM (build 25.40-b25, mixed mode)
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;
}
熟悉的朋友,肯定一眼就瞄出来了,这不是java.lang.String
类的equals
方法嘛!
2、源码面前,了无秘密
很喜欢侯捷老师的这句话,既然想知道equals
方法和==
有什么区别,我们就去看看源码呗,来,上Demo
public class EqualTest {
public static void main(String[] args) {
String str1 = "hello, world";
String str2 = "hello, world";
String str3 = str1;
if (str1.equals(str2)) {
System.out.println("str1 is equal to str2.");
}
if (str1 == str3) {
System.out.println("str1 == str3");
}
}
}
如你所想,程序的输出是:
str1 is equal to str2.
str1 == str3
我们再来看另一个版本的equals
方法的实现:
// Oracle的 java 1.8
// java version "1.8.0_201"
// Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
// Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
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;
}
看了两个版本的equals
方法,发现他们的实现,其实都一样:
- 先比较传入的参数是不是自己(同一个对象的引用,
hashCode
相同),如果是自己,直接返回true
; - 之后判断两个对象
value
的长度是否相等,不相等直接返回false
; - 判断每个
char
是否相同,不相同返回false
; - 如果都成立,当然是返回
true
喽;
所有我们得到结论:
==
要求比较严格,要求两个对象必须是同一个对象;equals
方法,判断完了是否是同一个对象,会继续判断两个对象的值是否相同,他的要求没那么严格,只要值相同,就好了。