混淆与平等的方法

时间:2009-11-30 20:15:07

标签: java equals

每当我使用带有两个不同StringBuffer对象的equals()方法时,我得到的结果为false,但是当我使用带有两个不同String对象的equals()方法时,我得到的结果为true。为什么呢?

    String s=new String("434");
    String s1=new String("434");

    System.out.println(s.equals(s1));//true

   StringBuffer s=new StringBuffer("434");
   StringBuffer s1=new StringBuffer("434");

   System.out.println(s.equals(s1));//false

8 个答案:

答案 0 :(得分:15)

StringBuffer不会覆盖equals()。因此,调用Object.equals(),它比较对象标识(内存地址)。 String确实覆盖了equals并比较了内容。

答案 1 :(得分:3)

StringBuffer不会覆盖Object#equals(),因此您正在体验基于引用标识的检查,而不是基于的检查。由于这些StringBuilder实例是不同的,每个实例都有不同的内存位置,因此基本Object#equals()实现将始终返回false。

以下是Java 6的定义:

public boolean equals(Object obj) {
  return (this == obj);
}

看到问题?

答案 2 :(得分:2)

至少在我的JDK版本(Sun 1.6)中,StringBuffer没有实现equals()方法。这意味着它继承了Object的equals()方法,该方法与==

相同

如果你真的想测试两个StringBuffers是否相等,你可以调用x.toString()。equals(y.toString())

答案 3 :(得分:2)

如果你想要做的是比较两个StringBuffer对象的String表示,那么你想要做的是:

StringBuffer sb1 = new StringBuffer("434");
StringBuffer sb2 = new StringBuffer("434");
if (sb1.toString().equals(sb2.toString())) {
  // whatever you want to do if they're equal
} else {
  // whatever you want to do if they're not
}

否则,你要比较两个StringBuffer 对象的相等性,而不是它们的内容 - 换句话说,执行Object#equals(),而不是(不存在的)StringBuffer #equals ()。

答案 4 :(得分:2)

当两个对象相同时,

equals仅在StringBuffer对象上返回true。要按照您想要的方式比较StringBuffers,请使用:

System.out.println(s.toString().equals(s1.toString());

答案 5 :(得分:1)

String s.equals将使用字符串表来比较实际的字符串,因为StringBuffer sb.equals将只使用equals方法的默认实现,只是比较对象指针。

答案 6 :(得分:0)

StringBuffer没有自己的equals方法实现,它从对象类继承equals()方法,因此比较hashvalues而不是比较stringBuffer中的实际内容。因此,我们必须将它显式地转换为一个字符串对象,该对象提供equals()方法的实现。

答案 7 :(得分:0)

String对象的语义是这样的:如果观察到两个实例包含相同的字符序列,它们将始终包含相同的字符序列,其中一个可以 - 至少从以下角度来看: String对象本身 - 在不改变程序语义的情况下,用对其他字符串的引用替换对其中一个字符串的所有引用。这些实例可能被认为是等效的,因为出于所有实际目的,封装在String实例中的唯一信息是目标实例中包含的字符序列。

相比之下,StringBuffer类型的变量不仅封装了一系列字符,还封装了特定实例的标识。如果两个变量引用同一个实例,则更改为一个变量引用的实例将影响另一个变量引用的实例(因为它是相同的实例)。如果它们引用不同的实例,则对一个引用的实例的更改不会影响另一个实例引用的实例。不让Java StringBuffer覆盖equals的决定不是懒惰的结果,而是基于StringBuffer个对象具有有意义的身份,而不相交的实例总是有不同的事实身份。