20 июн. 2012 г., 06:11 от Saravanan

Почему StringBuffer / StringBuilder не переопределяет equals или hashCode?

Почему StringBuffer / StringBuilder не переопределяетequals(), hashcode() методы из объекта?

Пожалуйста, предложите мне четкую картину, которая помогает понять проблему ...

Ответы на вопрос (0)

07 сент. 2015 г., 20:28 от guruZSunil Sharma

ту концепцию, давайте возьмем пример:

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? ОтветNO, Потому что, прежде чем вставить / поместить значение в HashMap, он внутренне проверяет и сравнивает значение hashCodestr1, str2, Оба возвращают одно и то же значение 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

финал хм:

{sunil=hello, sunil=bye}

Оба значения будут добавлены в hashMap, потому что sb1 и sb2 оба возвращают разные хэш-коды. StringBuilder / StringBuffer не переопределяет метод equals () и hashCode ().

Sun Microsystem wanted the programmer to allow adding 2 different String kind of Values in Hashtable or any other Hash Collections likes (HashSet,HashMap…),that’s the reason hashCode() and equals() were not overridden intentionally in StringBuffer,StringBuilder class.

06 янв. 2018 г., 07:37 от user207421MAnoj Sarnaik

mutable, С примером попробуйте это :)

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

}
20 июн. 2012 г., 05:58 от Matt Ball

StringBuffer изменчив, и его основное использование дляconstructing строки. Если вы хотите сравнить контент, звонитеStringBuffer#toString() и сравните возвращаемое значение.

Обычно не полезно переопределятьhashCode() для изменяемых объектов, поскольку изменение такого объекта, который используется в качестве ключа вHashMap может привести к тому, что сохраненное значение будет «потеряно».

ВАШ ОТВЕТ НА ВОПРОС