每当我使用带有两个不同StringBuffer对象的equals()方法时,我得到的结果为false,但是当我使用带有两个不同String对象的equals()方法时,我得到的结果为true。为什么呢?
String s=new String("434");
String s1=new String("434");
System.out.println(s.equals(s1));//true
StringBuffer s=new StringBuffer("434");
StringBuffer s1=new StringBuffer("434");
System.out.println(s.equals(s1));//false
答案 0 :(得分:15)
StringBuffer不会覆盖equals()。因此,调用Object.equals(),它比较对象标识(内存地址)。 String确实覆盖了equals并比较了内容。
答案 1 :(得分:3)
StringBuffer
不会覆盖Object#equals()
,因此您正在体验基于引用标识的检查,而不是基于值的检查。由于这些StringBuilder
实例是不同的,每个实例都有不同的内存位置,因此基本Object#equals()
实现将始终返回false。
以下是Java 6的定义:
public boolean equals(Object obj) {
return (this == obj);
}
看到问题?
答案 2 :(得分:2)
至少在我的JDK版本(Sun 1.6)中,StringBuffer没有实现equals()方法。这意味着它继承了Object的equals()方法,该方法与==
相同如果你真的想测试两个StringBuffers是否相等,你可以调用x.toString()。equals(y.toString())
答案 3 :(得分:2)
如果你想要做的是比较两个StringBuffer对象的String表示,那么你想要做的是:
StringBuffer sb1 = new StringBuffer("434");
StringBuffer sb2 = new StringBuffer("434");
if (sb1.toString().equals(sb2.toString())) {
// whatever you want to do if they're equal
} else {
// whatever you want to do if they're not
}
否则,你要比较两个StringBuffer 对象的相等性,而不是它们的内容 - 换句话说,执行Object#equals(),而不是(不存在的)StringBuffer #equals ()。
答案 4 :(得分:2)
equals仅在StringBuffer对象上返回true。要按照您想要的方式比较StringBuffers,请使用:
System.out.println(s.toString().equals(s1.toString());
答案 5 :(得分:1)
String s.equals将使用字符串表来比较实际的字符串,因为StringBuffer sb.equals将只使用equals方法的默认实现,只是比较对象指针。
答案 6 :(得分:0)
StringBuffer没有自己的equals方法实现,它从对象类继承equals()方法,因此比较hashvalues而不是比较stringBuffer中的实际内容。因此,我们必须将它显式地转换为一个字符串对象,该对象提供equals()方法的实现。
答案 7 :(得分:0)
String
对象的语义是这样的:如果观察到两个实例包含相同的字符序列,它们将始终包含相同的字符序列,其中一个可以 - 至少从以下角度来看: String
对象本身 - 在不改变程序语义的情况下,用对其他字符串的引用替换对其中一个字符串的所有引用。这些实例可能被认为是等效的,因为出于所有实际目的,封装在String
实例中的唯一信息是目标实例中包含的字符序列。
相比之下,StringBuffer
类型的变量不仅封装了一系列字符,还封装了特定实例的标识。如果两个变量引用同一个实例,则更改为一个变量引用的实例将影响另一个变量引用的实例(因为它是相同的实例)。如果它们引用不同的实例,则对一个引用的实例的更改不会影响另一个实例引用的实例。不让Java StringBuffer
覆盖equals
的决定不是懒惰的结果,而是基于StringBuffer
个对象具有有意义的身份,而不相交的实例总是有不同的事实身份。