将StringBuffer内容与equals进行比较

Gur*_*lki 25 java

StringBuffer sb1 = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb1 == sb2);
System.out.println(sb1.equals(sb2));
Run Code Online (Sandbox Code Playgroud)

这两个都是假的.这怎么可能?

Jaa*_*koK 34

所述equals的方法StringBuffer不是从覆盖Object,所以它只是参考平等的,即,与使用==.我怀疑其原因StringBuffer是可修改的,并且覆盖equals对于您可能希望用作键的类似值的类非常有用(尽管列表也有重写equals并且StringBuffer是一种列表,因此这有点不一致) .

  • 因为我刚刚掉进了同一个坑,我想说这只是一个**愚蠢的设计决定**:我必须写`sb1.toString()而不是`sb1.equals(sb2)` .equals(sb2.toString())`(因为这才是真正重要的)。或许也是这个原因:除了当前内容之外,还有一些内部属性(如缓冲区容量)可能会影响平等观,也可能不会。最后:`hashCode()` 也有同样的问题。 (2认同)

Mar*_*ark 24

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

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


Ste*_*n C 8

简单的答案是StringBuffer(和StringBuilder)不重新定义Object.equals()的基本语义.所以StringBuffer在StringBuffer上只会比较对象引用.

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

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


Ash*_*pta 8

 1.  System.out.println(sb1 == sb2);  
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

2. System.out.println(sb1.equals(sb2));
Run Code Online (Sandbox Code Playgroud)

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

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