在Java中考虑以下三个语句:
StringBuilder s1 = new StringBuilder("Boo");
StringBuilder s2 = new StringBuilder("Boo");
String s3 = new String ("Boo");
为什么s1.equals(s2)
返回false
?
答案 0 :(得分:4)
Java中的StringBuilder类与其他类不同,在Java类中,它不覆盖equals
和hashcode
。如果您是Java的新手,那么如果类没有提供equals
的重写实现,则系统可能会立即使用Object
类的equals
方法,这是不明显的。与比较引用(即内存指针)没有什么不同。
StringBuilder s1 = new StringBuilder("Boo");
StringBuilder s2 = new StringBuilder("Boo");
s1.equals(s2) // false
s1.toString().equals(s2.toString()) // true because String overrides equals
s1 = s2
s1.equals(s2) // true because same reference
通过使用toString
方法然后将其进行比较,将StringBuilder对象转换为String是明智的。
编辑:做了一些谷歌搜索来了解为什么StrintBuilder
和StringBuffer
不覆盖equals
和hashcode
的原因。事实证明,原因是预期这些类的对象将发生大量突变,因此,将它们用于哈希/比较可能不是一个好的设计。另一方面,字符串是不可变的。似乎这些只是作为具有附加功能的String的容器。