Почему StringBuffer/StringBuilder не переопределяет методы equals()
, hashcode()
из объекта?
Пожалуйста, предложите мне четкое изображение, которое поможет понять проблему...
Почему StringBuffer/StringBuilder не переопределяет методы equals()
, hashcode()
из объекта?
Пожалуйста, предложите мне четкое изображение, которое поможет понять проблему...
Потому что StringBuffer
является изменяемым, а его основное использование - для построения строк. Если вы хотите сравнить контент, вызовите StringBuffer#toString()
и сравните возвращаемое значение.
Как правило, не рекомендуется переопределять hashCode()
для изменяемых объектов, поскольку изменение такого объекта, которое используется как ключ в HashMap
, может привести к "потерянному" сохраненному значению.
На самом деле за этим все зависит от значения хэш-кода. Чтобы понять эту концепцию, давайте возьмем пример:
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.
Поскольку 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} */
}
}