深入理解equals和==的区别
程序员文章站
2024-03-20 18:33:28
...
今天在群里面看到这个问题,equals和==的区别是什么?我有点迟钝,不就是如果是String类型的话equals比较的是内容,非字符串类型则比较的是内容吗?我想里面的考点也没有多少吧。
然后我就回复了一个:equals本来就是为了比较内容出现的啊。
这其实是一种没有理解原理,死记硬背的体现。于是我很快被打脸了。
知耻而后勇,我立马就去和度娘哭诉。
于是乎,我在网上果然又看到了那些“大佬”的解析,基本上无外乎是和我一样,给出结论,来两个demo。甚至乎,我还看到了一篇极易误导小白的文章。说了一大堆,给的demo也是没有代表性,最终还是得出equals比较字符串的结论。
言归正传,来讲一下我的理解:
首先我们来看底层代码,找到Object类的equals方法,我们可以看到:
public boolean equals(Object obj) {
return (this == obj);
}
好的这就是所有了,额,是不是发现equals方法本质和==并无区别,或者说,完全一样。
但是为什么在实际使用的时候,字符串用equals又不一样呢?
用排除法,我们显然可以得出结论,一定是String类的问题。
所以让我们来看看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;
}
我们会发现重写的方法比较了String的char[]的每个元素是否相等,即所谓的内容是否相同。
到这里我们的问题已经基本上解决。
但我不得不感叹一句:手写JDK的人真牛逼!
一天一个小知识,一年就变成傻逼
上一篇: 关于拦截器cookie-session用户身份认证
下一篇: try catch的简单了解
推荐阅读
-
Django中的cookie与session详解和理解
-
深入理解cookie和session,这一篇就够了(建议收藏)
-
Cookies和Session的区别和理解
-
深入理解bind()和call/apply()方法的区别
-
深入理解equals和==的区别
-
深入理解==和equals的区别!通俗易懂!
-
对ThinkPHP中RBAC权限控制的理解和尝试
-
tensorflow中session和placeholder的理解
-
CommJs中的module.exports 和 exports 和 ES6 中的 export 和 export default 之间的区别
-
单引号和双引号的区别 博客分类: PHP