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
.
所以我得到了这段代码并提出了问题:编译和执行测试的结果是什么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 notnull
and is aString
object that represents the same sequence of characters as this object.
如果另一个对象不是 String
,例如一个StringBuilder
,那么它将永远是return false
。它不会将对象转换为String
。
像任何格式良好的 equals
方法一样,它将测试给定的对象是否相同 class (首先确保它不是 null
),如果是,则转换它为 String
,但它不会调用 toString
或以其他方式将给定对象转换为 String
.