• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

java - porównanie objektów HashSet .toString()

Object Storage Arubacloud
0 głosów
459 wizyt
pytanie zadane 26 października 2017 w Java przez kosaa Stary wyjadacz (14,130 p.)

czesc
Stringi przechowywane są przez maszyne wirtualną w jednym miejscu (są singletonami) wiec kod ponizej zwroci true

String s1 = "Kot";
String s2 = "Kot";

return s1 == s2;

dlaczego więc ten sam zabieg przeprowadzony na HashSet.toString() już taki sam nie jest i zwroci false?

HashSet<Character> hSet1 = new HashSet<Character>();
HashSet<Character> hSet2 = new HashSet<Character>();

hSet1.add('a');
hSet1.add('b');
hSet1.add('c');

hSet2.add('a');
hSet2.add('b');
hSet2.add('c');

return hSet1.toString() == hSet2.toString();

zamiast tego trzeba uzywac .equals() ktore sprawdzi wewnetrzne pola obiektu

return hSet1.toString().equals( hSet2.toString() );

 

komentarz 26 października 2017 przez xenonso Mądrala (5,160 p.)
Nie jestem pewien, ale wydaje mi się, że metoda add() jako argument przyjmuje obiekty, więc każdy taki obiekt String jest wywalany do innego miejsca w pamięci i wtedy zwykłe porówanie nie zadziała. Ogólnie do porównywania napisów najlepiej używać equals().
komentarz 26 października 2017 przez kosaa Stary wyjadacz (14,130 p.)

trzeba by sprawdzić jak robione to jest pod spodem, niby nie ma tu jawnego użycia add(new Character('x')) wiec teoretycznie powinno być wskazaniem na ten sam char

co do equals to zgadzam sie, w tym wypadku jest to najrozsądniejsze wyjście

p.s.
ciekawe co zwraca hashSet.toString(), bo jeśli jest to new String() to by wszystko było jasne

komentarz 26 października 2017 przez mbabane Szeryf (79,280 p.)

Tak wyglada toString HashSet:

public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }

A tak StringBuilder'a:

 @Override
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }

Wiec, jest wywolywane new String(), a zatem nie korzysta się z mechanizmu String poola

komentarz 26 października 2017 przez kosaa Stary wyjadacz (14,130 p.)
i wszystko jasne, dzięki

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 240 wizyt
pytanie zadane 19 lutego 2019 w Java przez must Bywalec (2,980 p.)
0 głosów
2 odpowiedzi 396 wizyt
pytanie zadane 16 czerwca 2017 w Java przez agigi1988 Nowicjusz (190 p.)
0 głosów
1 odpowiedź 696 wizyt

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...