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?
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).
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+.
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.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.
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.
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
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. :)
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