Dlaczego metoda StringBuffer/StringBuilder nie zastępuje metod z obiektu od , hashcode()
?Dlaczego StringBuffer/StringBuilder nie zastępuje równości lub hashCode?
Proszę zasugerować mi jasny obraz, który pomaga zrozumieć problem ...
Dlaczego metoda StringBuffer/StringBuilder nie zastępuje metod z obiektu od , hashcode()
?Dlaczego StringBuffer/StringBuilder nie zastępuje równości lub hashCode?
Proszę zasugerować mi jasny obraz, który pomaga zrozumieć problem ...
Ponieważ StringBuffer
jest zmienny, a jego podstawowym zastosowaniem jest konstruowania sznurki. Jeśli chcesz porównać zawartość, zadzwoń pod numer StringBuffer#toString()
i porównaj zwróconą wartość.
Generalnie nie ma sensu zastępowanie hashCode()
dla obiektów zmiennych, ponieważ modyfikacja takiego obiektu, który jest używany jako klucz w HashMap
, może spowodować utratę zapamiętanej wartości.
W rzeczywistości za tym wszystkim wszystko zależy od wartości kodu hashcode. Aby zrozumieć tę koncepcję weźmy przykład:
String str1 = new String("sunil");
String str2 = new String("sunil");
HashMap hm = new HashMap()
hm.put(str1,"hello");
hm.put(str2,"bye");
ostateczną Hm:
hm = { sunil=bye }
W powyższym kodzie str1 i słowo2 są dwa różne obiekty String. Powinien zostać dodany w HashMap? Odpowiedź: NO. Ponieważ przed wstawieniem/umieszczeniem wartości w HashMap, wewnętrznie sprawdza i porównuje wartość hashCode z str1, str2. Zarówno retun ma taką samą wartość hascode, ponieważ nadpisuje klasę String równą() i hashcode(). Tak więc po wykonaniu hm.put(str2,"bye");
pierwszy klucz zostanie zastąpiony nową wartością. Teraz spróbuj tego:
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
końcowy hm:
{sunil=hello, sunil=bye}
Zarówno wartość zostanie dodana w HashMap ponieważ SB1 i SB2 zarówno zwraca inny hashcode. StringBuilder/StringBuffer nie zastępuje metody equals() i hashCode().
Sun Microsystems chciał programator, aby umożliwić dodanie 2 różnego rodzaju String wartości w Hashtable lub innych zbiorach Hash lubi (HashSet, HashMap ...), to jest hashCode powodu() i equals() nie zostały nadpisane celowo w StringBuffer , Klasa StringBuilder.
'Sun Microsystem chciał, aby programista zezwolił na dodanie 2 różnych typów String w HashTable ...' To nie prawda, javadocs dla ['Hashtable'] (https: // docs. oracle.com/javase/8/docs/api/java/util/Hashtable.html) i ['Map'] (https://docs.oracle.com/javase/8/docs/api/java/util/Map.html) aktywnie zniechęcają do używania obiektów ze złamaną umową 'equals/hashcode' jako kluczami. Przechowywanie obiektów 'StringBuilder' na mapie nie jest przydatne, ponieważ nie można uzyskać wartości za pomocą klucza, chyba że masz oryginalny obiekt. –
Ponieważ StringBuffer to zmienne. Na przykład Wypróbuj to :)
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} */
}
}
Ten przykład demonstruje, że 'StringBuffer' nie zastępuje' równa się' i 'hashcode', ale nie pokazuje przyczyny. Sama odpowiedź ('Ponieważ StringBuffer jest zmienna ') jest kopiowana z wcześniejszej odpowiedzi. –
co oznacza Mutable? – Saravanan
Wykonaj badania, jeśli nie rozumiesz podstawowych zasad: http://stackoverflow.com/questions/3554192/what-is-a-mutable-class-in-oop –
Z całym szacunkiem nie zgadzam się z Twoim oświadczeniem _Nie jest ogólnie użyteczne przesłonić hashCode() dla obiektów zmiennych ... __ – Shahzeb