Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

На самом деле за этим все зависит от значения хэш-кода. Чтобы понять эту концепцию, давайте возьмем пример:

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 он внутренне проверяет и сравнивает значения hashCode str1, str2. Оба возвращают одно и то же значение хеш-кода, поскольку класс 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 хотела, чтобы программист разрешил добавлять 2 различных значения типа String в Hashtable или любые другие лайки Hash Collections (HashSet, HashMap…), поэтому причины hashCode() и equals() не были намеренно переопределены в классе StringBuffer, StringBuilder.

Ответ 3

Поскольку StringBuffer изменен. Пример: Try This:)

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

}