为什么StringBuffer/StringBuilder没有覆盖Object类的equals()和hashcode()方法?请给出一个清晰的解释,帮助读者理解这个问题。
StringBuffer
是可变的,其主要用途是用于构建字符串。如果你想比较内容,请调用 StringBuffer#toString()
并比较返回的值。hashCode()
,因为修改在 HashMap
中用作键的此类对象可能会导致存储的值“丢失”。实际上,这一切都取决于哈希码的值。为了理解这个概念,让我们举个例子:
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 }
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}
因为sb1和sb2返回不同的hashcode,所以两个值都将被添加到hashMap中。StringBuilder/ StringBuffer没有重写equals()和hashCode()方法。
Sun Microsystems希望程序员允许在Hashtable或任何其他哈希集合(如HashSet、HashMap等)中添加2种不同类型的字符串值,这就是为什么StringBuffer、StringBuilder类没有故意覆盖hashCode()和equals()的原因。
因为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
方法,但是并没有说明原因。答案本身(因为StringBuffer是可变的
)是从早期的回答中复制过来的。 - default locale
hashCode()
何时会被使用? - Matt Ball