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

Konkatenacja związana z String poolem

Object Storage Arubacloud
0 głosów
145 wizyt
pytanie zadane 14 sierpnia 2017 w Java przez rubesom Obywatel (1,690 p.)

Sprawdzałem co działa szybciej - String czy StringBuilder czy StringBuffer. Robiąc ten test wiedziałem, że zwycięzcą będzie prawdopodobnie StringBuilder ale zastanowiło mnie jedno.

Jak to jest z Stringiem przy takim zapisie:

String zmienna = "a";

I w takiej sytuacji:

		for(int i = 0; i < 10000; i++)
		{
		        zmienna = zmienna + "a";
		}

Jak traktować String poola? W przypadku zapisu String smienna = new String() sprawa jest dla mnie jasna - przy każdej konkatenacji powstanie nowy obiekt ale jak rozumieć poola? Jest to też za każdym razem nowy obiekt, jeżeli nie wykorzysta już raz użytej wartości, czy jeszcze inaczej to działa?

 

I czy String pool działa w obrębie danej klasy czy zupełnie inaczej?

1 odpowiedź

0 głosów
odpowiedź 15 sierpnia 2017 przez mbabane Szeryf (79,280 p.)

Java automatycznie zmienia każdy literał tekstowy na odpowiadający mu obiekt String.

Źródło: Herbert Schildt Java Kompendium programisty. Wydanie VIII

Tak więc ostatecznie wychodzi na jedno, bo można np. zrobić tak:

int lenght = "abc".length();

 

komentarz 15 sierpnia 2017 przez rubesom Obywatel (1,690 p.)

Nie rozumiem jak ma się to tyczyć do pytania o "pool".

Kiedy mam:

Integer zmienna = 123;

i

Integer zmienna2 = 1234;

To Integer pool jest modyfikowany tak jak np. przy użyciu StringBuilder() czy jest tworzony nowy pool z kolejną wartością?

komentarz 15 sierpnia 2017 przez mbabane Szeryf (79,280 p.)
Zdaje sie ze tutaj jest to wyjasnione:

http://www.journaldev.com/797/what-is-java-string-pool

Jesli tworzymy stringa bez uzycia konstruktora i pozniej tworzymy dokladnie to samo tez bez uzycia konstruktora to referencja jest ta sama.
komentarz 15 sierpnia 2017 przez rubesom Obywatel (1,690 p.)
Jest to referencja do tak zwanego "poola"/poola, ale czym jest ten pool, jak go traktować/interpretować?

Jest to coś na wzór obiektu, który jest (tak jak napisałem wyżej) modyfikowany przy dodawaniu do tego pool nowych wartości czy jest tworzony na nowo przy jakiejś zmianie, bo jest tak jak string immutable?
komentarz 15 sierpnia 2017 przez mbabane Szeryf (79,280 p.)

Ten rysunek tam przedstawia co to jest ten pool, jest to pewna struktura danych stworzona na potrzeby tego String'a, tak aby w pewien sposób zaoszczędzić pamieć.

Jeśli ten przykład nie pomoże to chyba nie potrafię tego wyjaśnić:

String abc = "abc";
String zm1 = "abc" + "d";
String zm2 = abc + "d";     
String zm3 = "abcd";
String zm4 = new String("abcd");
String zm5 = new String(zm3);

String aaa = abc + "d";

System.out.println("zm1 == zm2 : " + (zm1 == zm2) );
System.out.println("zm1 == zm3 : " + (zm1 == zm3) );
System.out.println("zm1 == zm4 : " + (zm1 == zm4) );
System.out.println("zm2 == zm3 : " + (zm2 == zm3) );
System.out.println("zm2 == zm4 : " + (zm2 == zm4) );
System.out.println("zm3 == zm4 : " + (zm3 == zm4) );
System.out.println("zm3 == zm5 : " + (zm3 == zm5) );
System.out.println("zm3 == zm5 : " + (zm4 == zm5) );

System.out.println("zm2 == aaa : " + (zm2 == aaa) );

Output:

zm1 == zm2 : false
zm1 == zm3 : true
zm1 == zm4 : false
zm2 == zm3 : false
zm2 == zm4 : false
zm3 == zm4 : false
zm3 == zm5 : false
zm3 == zm5 : false

zm2 == aaa : false

Jak widac tylko w jednym przypadku skorzystało z poola i nie stworzylo calkiem nowego stringa. W reszcie mamy nowe referencje.

komentarz 16 sierpnia 2017 przez rubesom Obywatel (1,690 p.)
edycja 16 sierpnia 2017 przez rubesom

A dla czego w Twoim przykładzie zm2 == zm3 daje false, kiedy dla zm1 == zm3 jest true?

Pewnie wychodzi na to, że źle rozumiem większą część.

Kiedy robię String zm2 = abc + "d";   to robię tak naprawdę zm2 = new StringBuilder(s).append("d") .toString(); i przez to powstaje mi nowy obiekt? Ale nie jest czasem tak, że kiedy powstaje np. String zmienna = new String("f") to powstaną i tak dwa obiekty -  jeden na stercie a drugi na poolu?

Możesz spróbować mi to opisać?

komentarz 16 sierpnia 2017 przez mbabane Szeryf (79,280 p.)
edycja 17 sierpnia 2017 przez mbabane

Przyznam ze az tak gleboko w to nie wchodzilem i nie wiem jak to wyglada jeszcze bardziej od srodka.

Ale tutaj zdaje się znajdziesz odpowiedz na pierwsze pytanie z 3 akapitu:
https://stackoverflow.com/questions/47605/string-concatenation-concat-vs-operator

 

A tak wyglada ipmlementacja metody toString dla StringBuilder:

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

Wiec robiac abc + "d" robi sie najprawdopodobniej:

String zm1 = new StringBuilder(abc).append("d").toString();

A jak widzisz wyzej toString StringBuildera tworzy stringa za pomoca new, stąd jest ten false.

Podobne pytania

0 głosów
0 odpowiedzi 141 wizyt
pytanie zadane 18 lipca 2020 w Java przez mibdbz Gaduła (4,300 p.)
+2 głosów
2 odpowiedzi 597 wizyt
pytanie zadane 25 września 2022 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,750 p.)
+10 głosów
3 odpowiedzi 507 wizyt

92,555 zapytań

141,402 odpowiedzi

319,541 komentarzy

61,939 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!

...