StringBuffer sb1 = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb1 == sb2);
System.out.println(sb1.equals(sb2));
这两个都返回false。怎么可能?
答案 0 :(得分:33)
equals
的{{1}}方法未被StringBuffer
覆盖,因此它只是引用相等,即与使用Object
相同。我怀疑这样做的原因是==
是可修改的,并且覆盖StringBuffer
对于您可能希望用作键的类似值的类非常有用(尽管列表也有一个被覆盖的equals
和equals
是一种列表,所以这有点不一致。)
答案 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比较,请参阅Collator。实施说明 :此方法在当前的 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的自然顺序与等号不一致。