题
每当使用equals()方法用两种不同的StringBuffer对象时,得到的结果为假,但是当我使用equals()方法用两种不同的字符串对象,我得到的结果为真。为什么呢?
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
解决方案
的StringBuffer没有重载equals()。这样,的Object.Equals()被调用,其比较对象标识(存储器地址)。串并重载equals和比较的内容。
其他提示
StringBuffer
不会覆盖Object#equals()
,所以你经历的参考身份为基础的检查,而不是值为基础的检查。由于这些StringBuilder
实例是不同的,每个具有不同的存储位置,基<=>实施将始终返回false。
下面的定义如Java 6:
public boolean equals(Object obj) {
return (this == obj);
}
请参阅问题?
至少在我的版本的JDK(太阳1.6)的,StringBuffer的未实现equals()方法。这意味着它继承对象的equals()方法,该方法是一样的==
如果你真的想测试两个StringBuffers平等,你可以调用x.toString()。等于(y.toString())
如果你在找什么做的是比较两个StringBuffer的对象的字符串表示,那么你想要做的是:
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的的对象的,而不是其内容的平等 - 换句话说,执行的对象#equals()方法,而不是(不存在)的StringBuffer#等号()。
仅等于当两个对象是同一上StringBuffer的对象返回true。为了比较StringBuffers你想要的方式,使用:
System.out.println(s.toString().equals(s1.toString());
的字符串s.equals将使用的字符串表,以比较实际的字符串,其中作为StringBuffer的sb.equals将只使用equals方法的缺省的实现只是和比较对象的指针。
StringBuffer的不具有它的equals方法的自己的FPGA实现它继承了等于从对象类()方法因此hashvalues进行比较,而不是比较在StringBuffer的实际内容。因此,我们必须明确地将它转换成一个字符串对象,它提供了一种用于等号()的实现方法。
String
对象的语义是使得如果两个实例是不断观察到含有相同的字符序列,它们将总是包含相同的字符序列和一个可以 - 至少从的观点出发< =>对象本身 - 取代与其他引用的字符串中的一个的所有参考文献在不改变程序语义。这样的情况下可以被认为是等价的,因为对于所有的实际目的,封装在StringBuffer
的一个实例的唯一信息是包含在所述目标实例的字符序列。
相反,类型的变量equals
封装不仅字符的序列,而且还身份一特定实例。如果两个变量引用同一个实例,改变成一个变量引用的实例会影响另一个提到的情况下(因为它是相同的实例)。如果它们指向不同的情况下,更改实例提到了一个不会影响另一个提到的实例。不要有Java的<=>覆盖<=>的决定是不是懒惰的结果,但宁可基于事实<=>对象有一个有意义的身份,并且不相交的情况下,总是有不同的身份。