“==”的理解
- “==”在比较基本数据类型时比较的是值,在比较引用类型时比较的是地址------这是很多人理解的方式,说的没错,但我想从本质上解释这一说法,不仅知其然,还要知其所以然。
- “==”实质上就是比较栈中的信息:基本数据类型中的值存在栈中,所以“= =”比较值;同样的道理,引用类型的地址存在栈中,所以“= =”比较的是地址。
int a=1;
int b=1;
System.out.println(a==b);
String c="123";
String d="123";
System.out.println(c==d);
String e=new String("123");
String f=new String("123");
System.out.println(e==f);
结果
true
true
false
解释
- a和b的值相等,c和d的地址相等,e和f的地址不相等(不知道为什么c和d的地址相等,e和f的地址不相等的同学可以看一下我的String类的创建方式及其区别这篇文章)
“equals”的理解
- equals是object类的一个方法,可以被重写,如果没有被重写,这个方法有其默认的代码块(如下)
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;
}
解释
- 可能看不懂,可能有点蒙,简单来说就是如下( 以a.equals(b)为例 )
- 先看a和b的地址是否相同,如果相同,返回true,结束;如果不同,继续看下边的代码
- 再看b是不是String类,不是就false,结束,是的话就接着看
- 然后看a和b的字符串长度是否相等,不相等就是false,结束;如果相等接着看
- 最后看a和b的每一个字符是否相等,相等就true,不相等就false
图解