为什么String.equals中有一个"=="符号?

3
为什么Java在equalsIgnoreCase方法中比较(this == another String)来检查字符串的大小写不敏感性?
另外,String equals方法是通过比较(this == another String)来比较两个对象的吗?
以下是Java 6中String类equalsIgnoreCase方法的实现。
 public boolean equalsIgnoreCase(String anotherString) {
        return (this == anotherString) ? true :
               (anotherString != null) && (anotherString.count == count) &&
           regionMatches(true, 0, anotherString, 0, count);
    }

以下是Java 6:String类的equals实现。

 public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }

7
因为直接物体比较很快,所以检查字符串是否与自身进行比较是一种快速的优化方法。 - Evan Knowles
1
请注意,String.equals 的实际实现是内置的,提供的 Java 实现只是参考代码(用于解释器、代码分析工具等)。 - Tagir Valeev
@TagirValeev:有趣!你有这方面的任何来源吗?现在(在你发表评论5年后),标准库中的许多方法都被标记为@HotSpotIntrinsicCandidate,但equals没有。你确定它是内部化的吗? - Lii
@Lii @HotSpotIntrinsicCandidate 标记只是给想将某个方法变成内部函数(或已经变成)的开发人员一个提示。这并不意味着该方法实际上是内部函数还是非内部函数。您可以在 HotSpot 源代码中看到实际的实现,在这里 - Tagir Valeev
@TagirValeev:非常有趣,谢谢!我知道@HotSpotIntrinsicCandidate只是一个提示,但我猜想他们会将其放在所有在HotSpot中内置的方法上。显然我错了。你有任何想法为什么String#equals没有这个提示吗? - Lii
3个回答

10
为什么Java在equalsIgnoreCase方法中比较(this == another String)以检查字符串大小写不敏感?这是一种优化。如果传入的引用与“this”完全相同,则equals必须返回true,但我们不需要查看任何字段等。所有内容都与自身相同。来自Object.equals(Object)文档的说明很常见的情况是:相等检查通常从以下方面开始: - 其他引用是否等于“this”? 如果是,则返回true。 - 其他引用是否为空? 如果是,则返回false。 - 其他引用是否指向错误类型的对象? 如果是,则返回false。 然后您可以进行特定于类型的检查。

2
"==" 在比较相同对象时返回真值——因为字符串的 内部化 操作,所以它比其他任何类更容易实现效率增加。
需要注意的是这段代码:
return (this == anotherString) ? true : <rest of line>

这句话的英译中文是:“在我看来,这句话本可以写得更优雅一些。”
return this == anotherString || <rest of line>

1
 this == another object 

这是几乎所有对象的基本检查方法,而不仅仅是String类。在您自己的类中首先检查这一点既高效又是一个好习惯。逻辑很简单:如果两者具有相同的引用,则它们始终引用同一对象,因此它们是相等的。如果“this == another object”为真,则不需要任何其他比较来确保它们相等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接