StringBuffer如何在内部处理字符串? 我尝试运行下面的例子并得到答案为“字符串不相等”。
据我所知,如果两个字符串具有相同的值,则equals()返回true。那么在这种情况下发生了什么?
class StringBufferTest {
public static void main(String[] args) {
String newString = "HelloWorld";
StringBuffer buffer = new StringBuffer(newString);
if (buffer.equals(newString)) {
System.out.println("Strings are equal");
} else {
System.out.println("String are unequal");
}
}
}
答案 0 :(得分:8)
您正在将StringBuffer
的实例与String
的实例进行比较,但不会为不同的类型提供所需的结果。请注意,StringBuffer
将使用普通Object#equals
,因为它不会覆盖它(由StringBuffer
JavaDoc指出String#equals
确实覆盖它)。您必须比较String
的{{1}}内容,而不是buffer
变量的对象引用:
buffer
此外,从Java 5开始,使用if (buffer.toString().equals(newString)) {
//...
}
代替StringBuilder
会更好。有关更多信息:Difference between StringBuilder and StringBuffer
答案 1 :(得分:2)
equals(
返回false。无论包含的字符串如何,StringBuffer
都是与String
不同的类型,并且比较永远不会成立。
buffer.toString.equals(newString)
应该有用。
答案 2 :(得分:0)
您正在比较:
if (buffer.equals(newString))
实际上,它将StringBuffer对象类型与String对象类型进行比较。那显然会失败。
为了从equals
方法返回true,您需要比较相同类型的对象。
public boolean equals(Object obj)
指示某个其他对象是否“等于”此对象 equals方法在非null对象引用上实现等价关系:它是自反的:对于任何非空参考值x,x.equals(x)应该返回true。
它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。 它是传递性的:对于任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,则x.equals(z)应返回true。 /> 它是一致的:对于任何非空引用值x和y,x.equals(y)的多次调用始终返回true或始终返回false,前提是没有修改对象的equals比较中使用的信息。
对于任何非空引用值x,x.equals(null)应返回false。
答案 3 :(得分:0)
equals()
contract表示x.equals(y)
当且仅当x.getClass() == y.getClass()
时才返回true。换句话说,x
和y
必须是同一个类的实例。在这种情况下,您要尝试将StringBuffer
与String
进行比较。对于行为良好的false
方法,比较两个不同类的实例始终为equals()
。
为了进行有意义的比较,您需要获取StringBuffer
的内容:
buffer.toString().equals(newString)
答案 4 :(得分:0)
等于具有String
对象的StringBuffer
对象,请使用:
buffer.toString()。等于(newString)
并且更好地使用StringBuilder
,因为StringBuffer
不是TheredSafe