为什么StringBuffer的/ StringBuilder的不忽略equals或的hashCod

2019-06-25 14:22发布

为什么StringBuffer的/ StringBuilder的没有覆盖equals() hashcode()从对象的方法?

请建议我清晰的画面,帮助理解问题...

Answer 1:

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

这是不一般有用重写hashCode()用于可变对象,因为修改被用作一个关键这样的对象HashMap可能导致所存储的值到“丢失”。



Answer 2:

其实,这一切的背后取决于哈希码码值。 要理解这个概念,让我们的例子:

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是两个不同的字符串对象。 它应该在HashMap中加入? 答案是否定的。 在HashMap中由于插入前/推杆价值,它在内部检查和比较STR1,STR2的哈希码值。 既retun相同hascode值,因为String类覆盖equals()和散列码()方法。 因此,在执行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()方法。

太阳微系统希望程序员允许添加2种不同的字符串类型的在Hashtable中值或任何其他哈希集合的喜欢(HashSet的,HashMap的...),这就是原因hashCode()和equals()方法均未StringBuffer的故意覆盖,StringBuilder类。



Answer 3:

由于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} */
    }

}


文章来源: Why does StringBuffer/StringBuilder not override equals or hashCode?
标签: java oop