String s="";
StringBuffer sb2=new StringBuffer("hi");
StringBuffer sb3=new StringBuffer(sb2);
StringBuffer sb4=sb3;
if(sb2.equals(sb3))
{
System.out.println("sb2.equals(sb3):"+sb2.equals(sb3));
s+="2 ";
}
if(sb3.equals(sb4))
{
System.out.println("sb3.equals(sb4):"+sb3.equals(sb4));
s+="3 ";
}
为什么首先是if给出false而第二个给出true,因为s2,s3,s4都是StringBuffer对象而String Buffer没有equal()方法?
答案 0 :(得分:6)
Here's StringBuffer
类的Javadoc,它将equals
列为继承自类java.lang.Object
的方法之一。
因此,它不会覆盖equals
方法,这意味着Object
类的equals
方法用于比较两个StringBuffer
对象。由于它只是检查引用(即使用==
运算符),因此false
得到sb2.equals(sb3)
(它们是两个不同的Objects
)。
Here's Javadoc for Object的equals
方法,它说如下:
指示某个其他对象是否“等于”此对象。等于 method在非null对象上实现等价关系 参考
答案 1 :(得分:1)
StringBuffer
不会覆盖equals()
,因此它会继承Object
的{{1}}实施,这与equals()
基本相同。这意味着:
==
为false,因为sb2和sb3引用了不同的对象。sb2.equals(sb3)
为真,因为它们都引用同一个对象。答案 2 :(得分:1)
所有其他类实际上是Object
类的子类,因此StringBuffer
是声明中Object
的子类
如果查看它包含Object
方法的.equals()
类文档,如果对象具有相同的哈希码,则此方法返回true
如果查看StringBuffer
类文档,它没有.equals()
方法,因为它实际上继承了超类.equals()
的{{1}}方法
答案 3 :(得分:1)
StringBuffer
未覆盖equals
方法。所有类都是Object.java
的子类,因此StringBuffer
的对象继承equals
方法。 equals
中Object.java
中的实施基于==
的结果考虑引用相等性,它只返回return (this == obj);
,其中obj
是equals
的参数方法(public boolean equals(Object obj)
)
String.java
会覆盖equals
方法。您应该通过从String
StringBuffer
对象来使用它
为了平等,您可以使用如下。
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
if( (sb1.toString()).equals(sb2.toString())){
System.out.println(" true ");
}else {
System.out.println(" false ");
}