Java 在下面的代码中,是’;t两个对象引用都是StringBuilder类型?

Java 在下面的代码中,是’;t两个对象引用都是StringBuilder类型?,java,Java,考虑Java中的以下三条语句: StringBuilder s1=新的StringBuilder(“Boo”) StringBuilder s2=新的StringBuilder(“Boo”) strings3=新字符串(“Boo”) 为什么s1.equals(s2)返回false?Java中的StringBuilder类与其他类不同,它不重写equals和hashcode。如果您是Java新手,可能不会立即发现,如果一个类没有提供equals的重写实现,系统将使用对象class'equals方法

考虑Java中的以下三条语句:

  • StringBuilder s1=新的StringBuilder(“Boo”)
  • StringBuilder s2=新的StringBuilder(“Boo”)
  • strings3=新字符串(“Boo”)

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

    Java中的StringBuilder类与其他类不同,它不重写
    equals
    hashcode
    。如果您是Java新手,可能不会立即发现,如果一个类没有提供
    equals
    的重写实现,系统将使用
    对象
    class'
    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对象转换为字符串,然后进行比较


    编辑:通过谷歌搜索了解为什么
    StrintBuilder
    &
    StringBuffer
    不会覆盖
    equals
    &
    hashcode
    。事实证明,原因是这些类的对象预期会发生严重变异,因此使用它们进行哈希/比较可能不是一个好的设计。另一方面,字符串是不可变的。似乎这些只是用来作为具有附加功能的字符串的容器

    “StringBuilder实现了Compariable,但不重写equals。因此,StringBuilder的自然顺序与equals不一致。”使用toString()进行相等性检查您应该在示例中添加s1.toString().equals(s2.toString()):)upd:正如我写的那样…谢谢@Sarief。添加。也
    s1。与(s2)==0相比