【发布时间】:2012-06-22 04:17:58
【问题描述】:
为什么 StringBuffer/StringBuilder 不覆盖对象中的equals()、hashcode() 方法?
请给我建议清晰的图片,以帮助理解问题...
【问题讨论】:
为什么 StringBuffer/StringBuilder 不覆盖对象中的equals()、hashcode() 方法?
请给我建议清晰的图片,以帮助理解问题...
【问题讨论】:
因为StringBuffer 是可变的,它的主要用途是构造 字符串。如果要比较内容,调用StringBuffer#toString(),比较返回值。
对于可变对象覆盖hashCode() 通常没有用处,因为修改用作HashMap 中的键的此类对象可能会导致存储的值“丢失”。
【讨论】:
hashCode()?
实际上这一切都取决于哈希码代码值。为了理解这个概念,让我们举个例子:
String str1 = new String("sunil");
String str2 = new String("sunil");
HashMap hm = new HashMap()
hm.put(str1,"hello");
hm.put(str2,"bye");
最后的嗯:
hm = { sunil=bye }
在上面的代码中,str1 和 str2 是两个不同的 String 对象。是否应该将它们单独添加到 HashMap 中?答案是否。这是因为在 HashMap 中插入/放入值之前,它会在内部检查和比较 str1、str2 的 hashCode 值。两者都返回相同的哈希码值,因为 String 类覆盖了 equals() 和 hashcode() 方法。因此,在执行 hm.put(str2,"bye"); 时,第一个键将被新值覆盖。现在试试这个:
StringBuilder sb1 = new StringBuilder("sunil");
StringBuilder sb2 = new StringBuilder("sunil");
HashMap hm = new HashMap()
hm.put(sb1,"hello");//sb1 and sb2 will return different HashCode
hm.put(sb2,"bye");// StringBuffer/StringBuilder does not override hashCode/equals methods
最后的嗯:
{sunil=hello, sunil=bye}
这两个值都将被添加到 hashMap 中,因为 sb1 和 sb2 都返回不同的哈希码。 StringBuilder/StringBuffer 不会覆盖 equals() 和 hashCode() 方法。
Sun Microsystem 希望程序员允许在 Hashtable 或任何其他 Hash 集合(HashSet、HashMap...)中添加 2 种不同的 String 类型的值,这就是 hashCode() 和 equals() 没有被有意覆盖的原因StringBuffer,StringBuilder 类。
因为 StringBuffer 是可变的。举个例子试试这个:)
package test;
import java.util.HashMap;
public class CheckHashcodeEquals {
public static void main(String[] args) {
/*
* String class override equals() and hashcode() method thats way
* override value of HashMap
*/
String s1 = new String("Arya");
String s2 = new String("Arya");
HashMap hm = new HashMap<>();
hm.put(s1, "A1");
hm.put(s2, "A2");
System.out.println(hm); /* Output: {Arya=A2} */
/*
* String class does not override equals() and hashcode() method thats
* way insert duplicate value
*/
StringBuffer sb1 = new StringBuffer("Arya");
StringBuffer sb2 = new StringBuffer("Arya");
HashMap hm2 = new HashMap<>();
hm2.put(sb1, "A1");
hm2.put(sb2, "A2");
System.out.println(hm2); /* Output: {Arya=A2, Arya=A1} */
}
}
【讨论】:
StringBuffer 没有覆盖equals 和hashcode,但没有说明原因。答案本身 (Because StringBuffer is mutable) 是从之前的答案中复制而来的。