Вопрос по oop, java – Почему StringBuffer / StringBuilder не переопределяет equals или hashCode?

27

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

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

Ваш Ответ

3   ответа
-2

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

}
Этот пример демонстрирует, чтоStringBuffer не переопределяетequals а такжеhashcode, но не показывает почему. Сам ответ (Because StringBuffer is mutable) скопировано из более раннего ответа.
5

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

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.

Sun Microsystem wanted the programmer to allow adding 2 different String kind of Values in Hashtable ... Это не правда, Javadocs дляHashtable а такжеMap активно препятствовать использованию объектов со сломаннымequals/hashcode контракт как ключи. храненияStringBuilder объекты на карте бесполезны, потому что вы не сможете получить значение по ключу, если у вас нет исходного объекта.
36

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

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

что здесь означает Мутабл? Saravanan
При всем моем уважении я не согласен с вашим утверждениемIt is not generally useful to override hashCode() for mutable objects...
Проведите исследование, если не понимаете самых основных принципов:stackoverflow.com/questions/3554192/…
Первой очевидной точкой отсчета для меня был любой класс ORM, так что вот ссылка сhibernate и долгое обсуждение здесь, на SOstackoverflow.com/questions/5031614/…
@Shahzeb как насчет примера того, когда изменяемый объектhashCode() может быть использован?

Похожие вопросы