为什么StringBuffer / StringBuilder不会覆盖equals或hashCode?

时间:2012-06-20 03:55:21

标签: java oop

为什么StringBuffer / StringBuilder不会覆盖对象的equals()hashcode()方法?

请建议我清楚的图片,以帮助理解问题...

3 个答案:

答案 0 :(得分:37)

因为StringBuffer是可变的,并且它的主要用途是构建字符串。如果您想比较内容,请致电StringBuffer#toString()并比较返回的值。

为可变对象覆盖hashCode()通常没用,因为修改用作HashMap中的键的对象可能会导致存储的值“丢失”。

答案 1 :(得分:6)

实际上这背后的一切都取决于hashcode代码值。要理解这个概念,我们举个例子:

String str1 = new String("sunil");
String str2 = new String("sunil");

HashMap hm = new HashMap()
hm.put(str1,"hello");
hm.put(str2,"bye");

final hm:

hm = { sunil=bye }

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

final hm:

{sunil=hello, sunil=bye}

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

Sun Microsystem希望程序员允许在Hashtable或任何其他Hash Collections中添加2种不同的String类型的值(HashSet,HashMap ...),这就是为什么hashCode()和equals()没有被故意覆盖的原因StringBuffer,StringBuilder类。

答案 2 :(得分:-2)

因为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} */
    }

}