String.equals(StringBuilder) 和 StringBuilder.equals(String) 混淆

String.equals(StringBuilder) and StringBuilder.equals(String) Confusion

所以我得到了这段代码并提出了问题:编译和执行测试的结果是什么class。

package com.foo.bar; 

public class Test {
     public static void main(String[] args) {
         String str = "java";
         StringBuilder sb = new StringBuilder("java");

         System.out.println(str.equals(sb) + ":" + sb.equals(str));
     }
}

根据他们和运行通过Eclipse时程序的结果是

false:false

我不明白为什么会给出上面的输出。我认为 String class 覆盖 .equals 以便它将值转换为字符串并进行比较。即:

Object b, Object c -> 
b.equals(c) ->
b.toString.equals(c.toString()) //b is a String

正在 运行宁 String.equals()。如果您有 str -> "java"sb -> "java",它们都覆盖了 toString。

str.equals(sb) -> str.toString().equals(b.toString) -> true

不,String.equals 不会将另一个参数转换为 String 然后比较字符。

Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.

如果另一个对象不是 String,例如一个StringBuilder,那么它将永远是return false。它不会将对象转换为String

像任何格式良好的 equals 方法一样,它将测试给定的对象是否相同 class (首先确保它不是 null),如果是,则转换它为 String,但它不会调用 toString 或以其他方式将给定对象转换为 String.