将StringBuffer内容与equals进行比较

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

这里都是返回假。 这怎么可能?

StringBufferequals方法不会被Object覆盖,所以只是引用相等,即与使用==相同。 我怀疑这是因为StringBuffer是可修改的,重写equals对于你可能想要用作键的类似于类的类来说是非常有用的(尽pipe列表也有一个重载的equalsStringBuffer是一种列表,所以这是有点不一致)。

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

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

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

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

这是因为“==”检查引用相等,并且由于sb1和sb2是不同的对象引用,所以在这种情况下的输出是“假”

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

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

由于.equals()方法在StringBuffer类中没有被覆盖,所以输出为“false”。 所以它使用父级“Object”类中的.equals()方法。 在对象类中.equals()已被写入来检查引用的相等性。

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

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

实际上,String,StringBuffer,StringBuilder和CharBuffer都实现了CharSequence接口,并且这个接口的javadoc这样说:

这个接口不会改进equals和hashCode方法的一般合约。 因此,比较实现CharSequence的两个对象的结果通常是未定义的。 每个对象都可以由不同的类来实现,并且不能保证每个类都能够testing它们的实例是否与其他实例相同。 因此,将任意CharSequence实例用作集合中的元素或映射中的键是不合适的。

StringBuffer似乎没有自己的equals方法,所以我的第一个猜测是StringBufferinheritanceObjectequals方法,它使用sb1 == sb2进行比较。 因此,两种方法都可以得到相同的结果。

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

如果您正在尝试比较内容,请在String类中使用方法compareTo(…) – 即首先使用方法toString(). toString ()。compareTo )获取StringBuffer的 String内容。

PS。 从JDK 5起,还有另外一个更快的类,其行为与StringBuffer完全相同 – 它是StringBuilder 但也不是线程安全的。

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

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

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