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

时间:2019-03-13 18:39:32

标签: string java-8 stringbuilder

因此,我得到了这段代码,并提出了一个问题:编译和执行Test类的结果是什么。

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,以便将值转换为字符串并进行比较。即:

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

1 个答案:

答案 0 :(得分:2)

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

  

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

如果另一个对象不是String,例如StringBuilder,那么它将始终返回false。它将将对象转换为String

像任何格式正确的equals方法一样,它将测试给定对象是否是同一类(确保它不是null首先),如果是,则将其强制转换为{{1 }},但不会调用String或将给定对象转换为toString