首页 > 解决方案 > String.equals(StringBuilder) 和 StringBuilder.equals(String) 混淆

问题描述

所以给了我这段代码,问了一个问题:编译和执行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 以便将值转换为字符串并进行比较。IE :

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

标签: stringjava-8stringbuilder

解决方案


不,String.equals不会将其他参数转换为String然后比较字符。

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

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

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


推荐阅读