【问题标题】:How StringBuffer Objects are Compared for equality如何比较 StringBuffer 对象的相等性
【发布时间】:2017-04-11 14:24:48
【问题描述】:
 String s="";
StringBuffer sb2=new StringBuffer("hi"); 
StringBuffer sb3=new StringBuffer(sb2);
    StringBuffer sb4=sb3;

    if(sb2.equals(sb3))
    {
        System.out.println("sb2.equals(sb3):"+sb2.equals(sb3));
        s+="2 ";
    }


    if(sb3.equals(sb4))
    {
        System.out.println("sb3.equals(sb4):"+sb3.equals(sb4));
        s+="3 ";
    }

既然 s2,s3,s4 都是 StringBuffer 对象并且 String Buffer 没有 equal() 方法,为什么第一个 if 给出 false 而第二个给出 true?

【问题讨论】:

  • sb2 是在哪里定义的?请给我们minimal reproducible example
  • 您还没有向我们展示 sb2 是如何创建的。很可能它是一个单独的对象。但是你已经明确编码了 sb4 = sb3,所以这就是为什么第二部分是正确的。
  • @Jens 这真的重要吗? sb3 仍然是一个新对象,不管 sb2 是如何创建的。
  • @m0skit0 是的。要验证它,您必须拥有它
  • @Jens StringBuffer sb3=new StringBuffer(sb2); sb2.equals(sb3) 将始终为 false,无论 sb2 是如何创建的。

标签: java stringbuffer


【解决方案1】:

Here's StringBuffer 类的 Javadoc,它将 equals 列为继承自类 java.lang.Object 的方法之一。

因此,它不会覆盖equals 方法,这意味着Object 类的equals 方法用于比较两个StringBuffer 对象。因为它只是检查引用(即使用== 运算符),所以您将获得false 用于sb2.equals(sb3)(它们是两个不同的Objects)。

Here's Object 的equals 方法的Javadoc,它说如下:

指示其他对象是否“等于”这个对象。等于 方法在非空对象上实现等价关系 参考文献

【讨论】:

  • 哇,你打败了我 :)
  • 你太快了xD
  • @Ankit 这不是“重要的一点”,它是你所问的答案......
【解决方案2】:

StringBuffer 不会覆盖equals(),所以它继承了Objectequals() 实现,与== 基本相同。这意味着:

  • sb2.equals(sb3) 为 false,因为 sb2 和 sb3 引用不同的对象。
  • sb3.equals(sb4) 为真,因为两者都引用同一个对象。

【讨论】:

    【解决方案3】:

    所有其他类实际上是Object 类的子类,因此StringBuffer 在您的声明中是Object 的子类

    如果您查看 Object 类文档,它包含 .equals() 方法,如果两个对象具有相同的哈希码,则此方法返回 true

    如果您查看StringBuffer 类文档,它没有.equals() 方法,因为它实际上继承了超类Object.equals() 方法

    【讨论】:

      【解决方案4】:

      StringBuffer 不会覆盖equals 方法。所有类都是Object.java 的子类,因此StringBuffer 的对象继承equals 方法。 Object.java 中的 equals 中的实现基于 == 的结果考虑引用相等,它只是返回为 return (this == obj); 其中 objequals 方法的参数 (public boolean equals(Object obj))

      String.java 确实覆盖了equals 方法。您应该通过从StringBuffer 获取String 对象来使用它

      为了平等,你可以使用如下。

      StringBuffer sb1 = new StringBuffer("abc");
      StringBuffer sb2 = new StringBuffer("abc");
      if( (sb1.toString()).equals(sb2.toString())){
          System.out.println(" true ");
      }else { 
         System.out.println(" false ");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多