Dlaczego StringBuilder, gdy jest String?

Po raz pierwszy spotkałem się z StringBuilder i byłem zaskoczony, ponieważ Java ma już bardzo potężną klasę String, która umożliwia dodawanie.

Dlaczego druga klasa?

Gdzie mogę dowiedzieć się więcej o StringBuilder?

Author: Bozho, 2011-03-08

9 answers

String nie pozwala na dołączanie. Każda metoda wywołana na String tworzy nowy obiekt i zwraca go. Dzieje się tak dlatego, że String jest niezmienny - nie może zmienić swojego stanu wewnętrznego.

Z drugiej strony StringBuilder jest zmienna. Wywołanie append(..) zmienia wewnętrzną tablicę znaków, zamiast tworzyć nowy obiekt string.

Dlatego bardziej efektywne jest posiadanie:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 500; i ++) {
    sb.append(i);
}

Zamiast str += i, które utworzyłyby 500 nowych obiektów string.

Zauważ, że w przykładzie Używam pętli. Jak zauważa helios w komentarzach, kompilator automatycznie tłumaczy wyrażenia typu String d = a + b + c na coś w rodzaju

String d = new StringBuilder(a).append(b).append(c).toString();

Zauważ również, że istnieje StringBuffer oprócz StringBuilder. Różnica polega na tym, że ten pierwszy ma zsynchronizowane metody. Jeśli używasz jej jako zmiennej lokalnej, użyj StringBuilder. Jeśli zdarza się, że dostęp do niego jest możliwy przez wiele wątków, użyj StringBuffer (to rzadsze)

 172
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-02 17:56:01

Oto konkretny przykład dlaczego -

int total = 50000;
String s = ""; 
for (int i = 0; i < total; i++) { s += String.valueOf(i); } 
// 4828ms

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < total; i++) { sb.append(String.valueOf(i)); } 
// 4ms

Jak widać różnica w wydajności jest znacząca.

 61
Author: Amir Raminfar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:03:15

Klasa String jest niezmienna, podczas gdy StringBuilder jest zmienna.

String s = "Hello";
s = s + "World";

Powyższy kod utworzy dwa obiekty, ponieważ łańcuch jest niezmienny

StringBuilder sb = new StringBuilder("Hello");
sb.append("World");

Powyższy kod utworzy tylko jeden obiekt, ponieważ StringBuilder nie jest niezmienny.

Lesson: ilekroć istnieje potrzeba manipulowania/aktualizowania / dodawania łańcuchów wiele razy, należy użyć Stringbuildera jako wydajnego w porównaniu do łańcuchów.

 19
Author: unk1102,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:05:01

StringBuilder służy do budowania ciągów. Konkretnie, budując je w bardzo wydajny sposób. Klasa String jest dobra do wielu rzeczy, ale w rzeczywistości ma naprawdę straszną wydajność podczas montowania nowego ciągu z mniejszych części łańcucha, ponieważ każdy nowy ciąg jest całkowicie nowym, ponownie przydzielonym ciągiem. (To immutable) StringBuilder utrzymuje tę samą sekwencję w miejscu i modyfikuje ją (mutable ).

 8
Author: Rex M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:00:27

Klasa StringBuilder jest zmienna i w przeciwieństwie do String, pozwala modyfikować zawartość łańcucha bez potrzeby tworzenia większej liczby obiektów String, co może być zwiększeniem wydajności podczas intensywnej modyfikacji łańcucha. Istnieje również odpowiednik dla StringBuilder o nazwie StringBuffer, który jest również zsynchronizowany, więc jest idealny dla środowisk wielowątkowych.

Największy problem z łańcuchem znaków polega na tym, że każda operacja, którą z nim wykonasz, zawsze zwróci nowy obiekt, powiedz:

String s1 = "something";
String s2 = "else";
String s3 = s1 + s2; // this is creating a new object.
 5
Author: CarlosZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:04:04

StringBuilder jest dobry, gdy masz do czynienia z większymi strunami. Pomaga poprawić wydajność.

Oto Artykuł który uważam za pomocny .

Szybkie wyszukiwanie w google mogłoby Ci pomóc. Teraz zatrudniłeś 7 różnych osób do wyszukiwania w google . :)

 4
Author: Vanchinathan Chandrasekaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:04:51

Aby być precyzyjnym, StringBuilder dodawanie wszystkich łańcuchów to O(N), podczas gdy dodawanie łańcuchów to O (N^2). Sprawdzanie kodu źródłowego, jest to wewnętrznie osiągane przez utrzymywanie zmiennej tablicy znaków. StringBuilder wykorzystuje technikę powielania długości tablicy, aby osiągnąć wydajność ammortized O(N^2), kosztem potencjalnie podwojenia wymaganej pamięci. Możesz wywołać trimToSize na końcu, aby rozwiązać ten problem, ale zazwyczaj Obiekty StringBuilder są używane tylko tymczasowo. Możesz jeszcze poprawić wydajność poprzez zapewnienie dobrego początkowego odgadnięcia ostatecznego rozmiaru struny.

 4
Author: mahogny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-21 07:37:18

Wydajność.

Za każdym razem, gdy łączysz łańcuchy, tworzony jest nowy łańcuch. Na przykład:

String out = "a" + "b" + "c";

Tworzy to nowy, tymczasowy ciąg znaków, kopiuje do niego "a" i "b", co daje wynik "ab". Następnie tworzy kolejny nowy, tymczasowy ciąg znaków, kopiuje do niego "ab" i "c", w wyniku czego powstaje"abc". Wynik ten jest następnie przypisywany do out.

Rezultatem jestalgorytm Schlemiela malarza o (N2) (kwadratowej) złożoności czasu.

StringBuilder, z drugiej strony, pozwala dodajesz ciągi znaków na miejscu, zmieniając rozmiar wyjściowego ciągu w razie potrzeby.

 3
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:01:51

Java ma String, StringBuffer i StringBuilder:

  • String: Its immutable

  • StringBuffer: Its Mutable and ThreadSafe

  • StringBuilder: jego zmienny, ale nie ThreadSafe, wprowadzony w Javie 1.5

String eg:

public class T1 {

    public static void main(String[] args){

        String s = "Hello";

        for (int i=0;i<10;i++) {

            s = s+"a";
            System.out.println(s);
        }
    }
}

}

Wyjście: zostanie utworzonych 10 różnych łańcuchów zamiast tylko 1 łańcuchów.

Helloa
Helloaa
Helloaaa
Helloaaaa
Helloaaaaa
Helloaaaaaa
Helloaaaaaaa
Helloaaaaaaaa 
Helloaaaaaaaaa 
Helloaaaaaaaaaa

StringBuilder np.: zostanie utworzony tylko 1 obiekt StringBuilder.

public class T1 {

    public static void main(String[] args){

        StringBuilder s = new StringBuilder("Hello");

        for (int i=0;i<10;i++) {    
            s.append("a");
            System.out.println(s);
        }
    }
}
 1
Author: Kumar Vivek Mitra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 06:54:28