30

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

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

4

3 回答 3

41

因为StringBuffer是可变的,它的主要用途是构造字符串。如果要比较内容,调用StringBuffer#toString()并比较返回值。

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

于 2012-06-20T03:58:01.353 回答
7

实际上,这一切都取决于哈希码代码值。为了理解这个概念,让我们举个例子:

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 中插入/放入值之前,它会在内部检查并比较str1str2的 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 类型的值,这就是在 StringBuffer、StringBuilder 类中没有有意覆盖 hashCode() 和 equals() 的原因。

于 2015-07-30T05:02:36.940 回答
-1

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

}
于 2018-01-06T06:19:08.863 回答