为什么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:

 hm = { sunil=bye } 

在上面的代码中,str1和str2是两个不同的String对象。 它应该添加在HashMap中? 答案是否定的 。 因为在HashMap中插入/放入值之前,它会在内部检查并比较str1str2的 hashCode值。 两者都返回相同的hascode值,因为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 

最终的hm:

 {sunil=hello, sunil=bye} 

这两个值都将添加到hashMap中,因为sb1和sb2都返回不同的哈希码。 StringBuilder / StringBuffer不会覆盖equals()和hashCode()方法。

Sun Microsystem希望程序员允许在Hashtable或任何其他Hash Collections中添加2种不同的String类型的值(HashSet,HashMap …),这就是在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} */ } }