将StringBuffer内容与equals进行比较

时间:2010-01-06 10:45:23

标签: java

StringBuffer sb1 = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb1 == sb2);
System.out.println(sb1.equals(sb2));

这两个都返回false。怎么可能?

11 个答案:

答案 0 :(得分:33)

equals的{​​{1}}方法未被StringBuffer覆盖,因此它只是引用相等,即与使用Object相同。我怀疑这样做的原因是==是可修改的,并且覆盖StringBuffer对于您可能希望用作键的类似值的类非常有用(尽管列表也有一个被覆盖的equalsequals是一种列表,所以这有点不一致。)

答案 1 :(得分:23)

您正在比较StringBuffer对象的引用,而不是StringBuffer中的实际字符串。

System.out.println(sb1.toString().equals(sb2.toString()))将返回true,我认为这是您所期望或想要实现的目标。

答案 2 :(得分:6)

简单的答案是StringBuffer(和StringBuilder)不重新定义Object.equals()的基本语义。因此,StringBuffer上的equals将简单地比较对象引用。

实际上,String,StringBuffer,StringBuilder和CharBuffer都实现了CharSequence接口,这个接口的javadoc说明了这一点:

  

此接口不会细化equals和hashCode方法的常规协定。因此,比较实现CharSequence的两个对象的结果通常是未定义的。每个对象可以由不同的类实现,并且不能保证每个类能够测试其实例与另一个的实例是否相等。因此,将任意CharSequence实例用作集合中的元素或映射中的键是不合适的。

答案 3 :(得分:6)

 1.  System.out.println(sb1 == sb2);  

只有将StringBuffer对象与自身进行比较时,StringBuffer的equals方法才返回true。与任何其他StringBuffer相比,它返回​​false,即使两者包含相同的字符。

这是因为“==”检查引用相等性,因为sb1和sb2都是不同的对象引用,所以这种情况下的输出是“false”

如果你想检查这两个StringBuffer对象中的内容是否相等,你可以使用它:

sb1.toString().equals(sb2.toString())

2. System.out.println(sb1.equals(sb2));

这使得输出为“false”,因为.equals()方法尚未在StringBuffer类中被覆盖。所以它使用来自其父“Object”类的.equals()方法。在对象类中,已经编写了.equals()来检查引用相等性。

请注意,在String的情况下,sb3.equals(sb4)将返回“true”。因为.equals()方法已在String类中重写,以检查和匹配两个不同字符串的内容。

答案 4 :(得分:3)

StringBuffer似乎没有自己的equals方法,所以我的第一个猜测是StringBuffer继承了equals的{​​{1}}方法,使用Object进行比较。因此,两种方法都会产生相同的结果。

答案 5 :(得分:3)

比较两个对象的引用(sb1是1,sb2是第二),因此两者都不同。

如果您要比较内容 - 请在字符串类中使用 compareTo(...) - 即 - 首先获取字符串使用方法 toString() .toString()。compareTo StringBuffer 的内容。

聚苯乙烯。从JDK 5开始,还有另一个更快的类,其行为与 StringBuffer 完全相同 - 它是 StringBuilder ,也是,但不是线程安全的

StringBuffer sb1 = new StringBuffer("Java"); 
StringBuffer sb2 = new StringBuffer("Java"); 

System.out.println(sb1.toString().compareTo(sb2.toString())); 

答案 6 :(得分:1)

想知道为什么StringBuffer不会覆盖equals方法。可能是因为对象的内容是通过toString()方法获得的,并且具有所需的方法。

答案 7 :(得分:1)

有了JDK/11,现在可以比较两个StringBuffer,而无需另外的toString,这可以使用新引入的API-

public int compareTo​(StringBuffer another)
  

按字典顺序比较两个StringBuffer实例。这个方法   遵循与   CharSequence.compare(this, another)方法。   有关更细粒度,对语言环境敏感的String比较,请参阅Collat​​or。

     

实施说明 :此方法在当前的 this 上同步   对象,但不是此StringBuffer所使用的StringBuffer 另一个   比较。

     

返回 :如果此StringBuffer包含相同字符,则值为0   顺序与参数StringBuffer的顺序相同;一个负整数,如果   在字典上,此StringBuffer小于StringBuffer   论点如果此StringBuffer是   在字典上大于StringBuffer参数。

样品用量:

StringBuffer stringBuffer = new StringBuffer("null");
StringBuffer anotherStringBuffer = new StringBuffer("NULL");
System.out.println(stringBuffer.compareTo(anotherStringBuffer) == 0); // shall print 'false'

答案 8 :(得分:0)

不会覆盖Stringbuffer的equals()。它不比较值,它只比较参考值分配。这就是为什么你得到错误,因为他们都指的是不同的对象。

答案 9 :(得分:0)

这很棘手,让我在Object类等于方法功能中向您解释 根据Sun开发人员已覆盖equals方法的对象来匹配引用 在Collection,String,Wrapper类中,因此,如果此类在任何地方应用equals方法,则它将检查引用不满足,但此类除外,因为java中的每个类都间接地是Object类的子类,因此,如果要检查StringBuffer类中的内容,则可以覆盖该对象类等于方法 谢谢。

答案 10 :(得分:-1)

-> String,StringBuffer和StringBuilder扩展了Object类。 ->对象类包含equals(),用于比较两个对象的内存地址/引用。
-> equals()方法在String类中被覆盖,它将检查

content.tostring()
System.out.println(sbuffer1.toString().equals(sbuffer2.toString()))

-> StringBuffer的equals()方法不会从Object覆盖,而是实现Comparable,因此它将比较引用相等性,即与使用==相同。在字符串类中,在object.class中是equals()方法。因此,StringBuffer的自然顺序与等号不一致。