Najlepsze praktyki / wydajność: mieszanie StringBuilder.Dołącz za pomocą sznurka.concat

Staram się zrozumieć, jaka jest najlepsza praktyka i dlaczego dla łączenia liter i zmiennych łańcuchowych dla różnych przypadków. Na przykład, jeśli mam taki kod

StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
    .append(B_String).append("CCCCCCCCCCC").append(D_String)
    .append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
    .append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");

Czy tak to się robi? Z tego postu zauważyłem, że operator + na łańcuchach tworzy nową instancję Stringbuildera, łączy operandy i zwraca konwersję łańcuchów, co wydaje się o wiele bardziej skuteczne niż wywołanie .append(). pytanie. Ale co z String.concat()? Czy właściwe jest stosowanie .append() do każdej konkatenacji? Czy tylko dla zmiennych, a literały są w porządku dodawać za pomocą .concat()?

StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
    .append(B_String.concat("CCCCCCCCCCC")).append(D_String
    .concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
    .concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));

Jakie są ogólne zasady najlepszych praktyk i wydajności w takich sytuacjach? Czy moje założenie jest poprawne na + i naprawdę nie powinno być używane?

Author: Community, 2012-04-09

7 answers

+ operator

String s = s1 + s2

Za kulisami to jest przetłumaczone na:

String s = new StringBuilder(s1).append(s2).toString();

Wyobraź sobie, ile dodatkowej pracy dodaje, Jeśli masz s1 + s2 tutaj:

stringBuilder.append(s1 + s2)

Zamiast:

stringBuilder.append(s1).append(s2)

Wiele ciągów z +

Warto zauważyć, że:

String s = s1 + s2 + s3 + ... +sN

Jest tłumaczone na:

String s = new StringBuilder(s1).append(s2).append(s3)...apend(sN).toString();

concat()

String s = s1.concat(s2);

String tworzy char[] tablicę, która może pasować zarówno s1 jak i s2. Kopiuje zawartość s1 i s2 do nowej tablicy. Właściwie wymaga mniej pracy niż operator +.

StringBuilder.append()

Utrzymuje wewnętrzną tablicę char[], która rośnie w razie potrzeby. Nie tworzy się żadnego dodatkowego char[], jeśli wewnętrzny jest wystarczająco duży.

stringBuilder.append(s1.concat(s2))

Działa również słabo, ponieważ s1.concat(s2) tworzy dodatkową char[] tablicę i kopiuje s1 i s2 do niej tylko po to, aby skopiować nową zawartość tablicy do wewnętrznego StringBuilder char[].

To jest powiedziane, że powinieneś używać append() cały czas i dołączać surowe ciągi znaków (twój pierwszy kod fragment jest poprawny).

 162
Author: Tomasz Nurkiewicz,
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
2012-04-09 20:21:58

Kompilator optymalizuje konkatenację+.

Więc

int a = 1;
String s = "Hello " + a;

Przekształca się w

new StringBuilder().append("Hello ").append(1).toString();

Tutaj znajduje się doskonały temat wyjaśniający, dlaczego powinieneś używać operatora+.

 14
Author: Andy Turner,
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
2018-07-01 21:14:46

Optymalizacja jest wykonywana automatycznie przez kompilator.

Kompilator Java2 automatycznie przekonwertuje:

String s = s1 + s2; 

Do

String s = (new StringBuffer()).append(s1).append(s2).toString();
[2]}wzięte prosto z najlepszych praktyk Java na stronie Oracles.
 3
Author: BoldAsLove,
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
2014-05-12 19:41:16

Należy zawsze używać append.

concat Utwórz nowy ciąg tak, aby był ładny jak + myślę.

Jeśli concat lub użyjesz + z 2 ostatnim ciągiem, JVM może dokonać optymalizacji, więc jest to to samo, co w tym przypadku append.

 2
Author: alain.janinm,
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
2012-04-09 19:58:25

Jeśli połączysz dokładnie dwa łańcuchy, użyj String.concat (tworzy nowy łańcuch znaków, tworząc nową tablicę znaków, która pasuje do obu łańcuchów i kopiuje do niego tablice znaków obu łańcuchów).

Jeśli połączysz wiele (więcej niż dwa) łańcuchów w jednej linii, użyj + lub StringBuilder.dołączanie, to nie ma znaczenia, ponieważ kompilator konwertuje + na StringBuilder.Dołącz. Jest to dobre dla wielu łańcuchów, ponieważ utrzymuje jedną tablicę znaków, która rośnie w razie potrzeby.

Jeśli połączysz wiele łańcuchów przez wiele linii tworzy jeden StringBuilder i używa metody append. W końcu po zakończeniu dodawania ciągów do StringBuilder użyj go .toString () - Metoda tworzenia z niego ciągu znaków. W przypadku łączenia w wiele linii jest to szybsze niż druga metoda, ponieważ druga metoda utworzy nowy StringBuilder na każdej linii, dopisze łańcuchy, a następnie powróci do łańcucha, podczas gdy trzecia metoda używa tylko jednego Stringbuildera dla całej rzeczy.

 1
Author: Dakkaron,
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
2014-01-27 10:03:19

Użyj operatora + jest najlepszą praktyką, jest również prosty i czytelny.

Język Java zapewnia specjalne Wsparcie Dla ciągu znaków operatorem konkatenacji ( + ), oraz do konwersji innych obiektów na struny. Konkatenacja łańcuchów jest realizowana poprzez Klasa StringBuilder (lub StringBuffer) i jej metoda dodawania.

Oficjalny dokument: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

 0
Author: Do Nhu Vy,
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-08-10 03:34:26

W poziomie kodu bajtowego nie ma różnicy i nie kompromitujemy tam skuteczności. W przypadku wykonania kodu bajtowego, musi on przejść przez metodę przeciążania operatora inline dla + przez wywołanie append. następnie na poziomie języka assembly (Java jest napisana w C i C produkuje Assembly podobne do assembly, będzie dodatkowe wywołanie rejestru do store + wywołanie metody w stosie i będzie dodatkowe push. (w rzeczywistości cross-kompilator może optymalizować + wywołanie operatora, w takim przypadku dokonując nie ma różnicy w wydajności.)

Dobrą praktyką jest posiadanie jednego sposobu na zwiększenie czytelności. :)

 0
Author: Shevon Silva,
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
2017-09-26 14:26:21