2012-06-20 9 views

Odpowiedz

31

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.

+0

co oznacza Mutable? – Saravanan

+4

Wykonaj badania, jeśli nie rozumiesz podstawowych zasad: http://stackoverflow.com/questions/3554192/what-is-a-mutable-class-in-oop –

+1

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

5

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.

+0

'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. –

-2

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

} 
+0

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. –

Powiązane problemy