string - 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
解决方案
不,String.equals
不会将其他参数转换为String
然后比较字符。
将此字符串与指定对象进行比较。结果是
true
当且仅当参数不是null
并且是String
表示与该对象相同的字符序列的对象。
如果另一个对象不是 a String
,例如 a StringBuilder
,那么它将总是返回false
。它不会将对象转换为String
.
像任何格式良好的equals
方法一样,它将测试给定对象是否是同一个类(确保它不是null
第一个),如果是,则将其转换为 a String
,但它不会调用toString
或以其他方式将给定对象转换为 a String
。
推荐阅读
- python - ParaView Python 脚本导致无响应的可视化工具包 - Windows 上的 Win32OpenGL
- c++ - 为什么按功能键或箭头键时 getch 返回三个值?
- c - 参数化的通用 C 宏
- python - 你如何写出“A大于B,C和D”在一个有效的事情?
- java - Java 一次填充 2 个字节的数组
- database - Symfony 3 数据库连接
- vba - VBA宏:编译错误预期语句结束
- python - Pandas - 获取具有相同行值的多列值,并输入到 1 列
- javascript - 用javaScript注入的html文本输入忽略onclick材料设计css
- algorithm - 2个独特元素的最大总和