4.9 String相等判断
“二哥,如何比较两个字符串相等啊?”三妹问。
“这个问题看似简单,却在 Stack Overflow 上有超过 370 万+的访问量。”我说,“这个问题也可以引申为 .equals() 和 ‘==’ 操作符有什么区别。”
- “==”操作符用于比较两个对象的地址是否相等。
.equals()方法用于比较两个对象的内容是否相等。
“不是很理解。”三妹感到很困惑。
“我来举个不恰当又很恰当的例子,一看你就明白了,三妹。”
有一对双胞胎,姐姐叫阿丽塔,妹妹叫洛丽塔。我们普通人可能完全无法分辨谁是姐姐谁是妹妹,可她们的妈妈却可以轻而易举地辨认出。
.equals() 就好像我们普通人,看见阿丽塔以为是洛丽塔,看见洛丽塔以为是阿丽塔,看起来一样就觉得她们是同一个人;“==”操作符就好像她们的妈妈,要求更严格,观察更细致,一眼就能分辨出谁是姐姐谁是妹妹。
String alita = new String("小萝莉");
String luolita = new String("小萝莉");
System.out.println(alita.equals(luolita)); // true
System.out.println(alita == luolita); // false
就上面这段代码来说,.equals() 输出的结果为 true,而“==”操作符输出的结果为 false——前者要求内容相等就可以,后者要求必须是同一个对象。
“三妹,之前已经学过了,Java 的所有类都默认地继承 Object 这个超类,该类有一个名为 .equals() 的方法。”一边说,我一边打开了 Object 类的源码。
public boolean equals(Object obj) {
return (this == obj);
}
你看,Object 类的 .equals() 方法默认采用的是“==”操作符进行比较。假如子类没有重写该方法的话,那么“==”操作符和 .equals() 方法的功效就完全一样——比较两个对象的内存地址是否相等。
但实际情况中,有不少类重写了 .equals() 方法,因为比较内存地址的要求比较严格,不太符合现实中所有的场景需求。拿 String 类来说,我们在比较字符串的时候,的确只想判断它们俩的内容是相等的就可以了,并不想比较它们俩是不是同一个对象。
况且,字符串有字符串常量池的概念,本身就推荐使用 String s = "字符串" 这种形式来创建字符串对象,而不是通过 new 关键字的方式,因为可以把字符串缓存在字符串常量池中,方便下次使用,不用遇到 new 就在堆上开辟一块新的空间。
“哦,我明白了。”三妹说。
“那就来看一下 String 类的 .equals() 方法的源码吧。”我说。
public boolean equals(Object anObject) {
if (this == anObject) {
...真诚点赞 诚不我欺
回复