在下面的代码中,两个对象引用都不都是StringBuilder类型的吗?

时间:2018-11-09 11:26:05

标签: java

在Java中考虑以下三个语句:

  1. StringBuilder s1 = new StringBuilder("Boo");
  2. StringBuilder s2 = new StringBuilder("Boo");
  3. String s3 = new String ("Boo");

为什么s1.equals(s2)返回false

1 个答案:

答案 0 :(得分:4)

Java中的StringBuilder类与其他类不同,在Java类中,它不覆盖equalshashcode。如果您是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是明智的。

编辑:做了一些谷歌搜索来了解为什么StrintBuilderStringBuffer不覆盖equalshashcode的原因。事实证明,原因是预期这些类的对象将发生大量突变,因此,将它们用于哈希/比较可能不是一个好的设计。另一方面,字符串是不可变的。似乎这些只是作为具有附加功能的String的容器。