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

String.equals(StringBuilder)和StringBuilder.equals(String)混淆,string,java-8,stringbuilder,String,Java 8,Stringbuilder,所以我得到了这段代码并被问到一个问题:编译和执行测试类的结果是什么 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

所以我得到了这段代码并被问到一个问题:编译和执行测试类的结果是什么

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类会重写.equals,以便将值转换为字符串并进行比较。i、 e:

Object b, Object c -> 
b.equals(c) ->
b.toString.equals(c.toString()) //b is a String
它正在运行字符串.equals。如果您有str->java和sb->java,它们都覆盖了toString

str.equals(sb) -> str.toString().equals(b.toString) -> true
否,不将其他参数转换为字符串,然后比较字符

将此字符串与指定的对象进行比较。当且仅当参数不为null并且是表示与此对象相同的字符序列的字符串对象时,结果才为true

如果另一个对象不是字符串,例如StringBuilder,则它将始终返回false。它不会将对象转换为字符串


与任何格式良好的equals方法一样,它将测试给定对象是否为同一类,确保它首先不为null,如果为null,则将其转换为字符串,但它不会调用toString或以其他方式将给定对象转换为字符串。

为什么StringBuilder对象等于String对象?为什么String.equals会在对象上执行toString?在String对象上调用toString绝对没有任何作用。如果您查看源代码,它只返回它的selfequals所属字符串类,但当StringBuilder/StringBuffer的对象传递引用时,会比较引用,因为StringBuffer不重写对象类的equals方法。@gmanrocks否,它会检查它是否为字符串。如果不是,则返回false。如果是,则将其强制转换并检查字符串的内容是否与补遗相同。您可以使用检查字符串是否与StringBuilder、StringBuffer或CharBuffer等具有相同的内容。