将StringBuffer内容与equals进行比较
StringBuffer sb1 = new StringBuffer("Java"); StringBuffer sb2 = new StringBuffer("Java"); System.out.println(sb1 == sb2); System.out.println(sb1.equals(sb2));
这里都是返回假。 这怎么可能?
StringBuffer
的equals
方法不会被Object
覆盖,所以只是引用相等,即与使用==
相同。 我怀疑这是因为StringBuffer
是可修改的,重写equals
对于你可能想要用作键的类似于类的类来说是非常有用的(尽pipe列表也有一个重载的equals
和StringBuffer
是一种列表,所以这是有点不一致)。
您正在比较对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
方法,所以我的第一个猜测是StringBuffer
inheritanceObject
的equals
方法,它使用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()
不会被覆盖。 它不比较值,它只比较参考值分配。 这就是为什么你们都是假的,因为他们都指的是不同的对象。