2015-08-04 11 views
8

Przeczytałem szybko dokumentację Java8 String api.String.join() vs inne operacje łączenia ciągów znaków

Teraz jestem mało ciekawa metody String.join() do konkatowania/dołączania ciągów.

Taki przykład pomógł mi lepiej zrozumieć, choć:

//Old way: 
String str1 = "John"; 
String str2 = "Doe"; 
String result = str1 + " " +str2; 
//or by using str1.concat(str2); 

//New way: 
String result = String.join(" ", str1, str2); 

Nadal nie rozumiem, jaki powinno się używać. Czy są jakieś wydajności lub inne różnice między tymi dwoma procesami.

Każda pomoc zostanie bardzo doceniona.

+2

'concat' nie kontempluje ograniczników, a' join' może być wykonywane na wielu ciągach. Zwróć też uwagę, że łączenie wielokrotne z + nie może powodować operacji 'concat' nad łańcuchami. –

Odpowiedz

14

String.join polega na klasie StringJoiner, która sama polega na wewnętrznym StringBuilder, aby zbudować połączoną strunę.

Więc wydajność mądry to tak samo jak przy użyciu StringBuilder i dołączenie do niego, lub za pomocą łańcucha + (które obecnie są konwertowane do StringBuilder operacji przez kompilator).

Ale znaczenie String.join nie jest tak ogólny zamiennik + lub String.concat, ale będąc w „lewo” od operacji String.split. Ma to więcej sensu w tym kontekście - gdy masz kilka ciągów, które chcesz połączyć przy użyciu ogranicznika - niż jako zamiennik dla concat.

Oznacza to, że aby zbudować wyjście jak "a/b/c/d" lub "(a+b+c+d)" gdy masz a, b, c i d w tablicy lub listy, String.join lub StringJoiner uczyniłoby operacja jasne i czytelne.

+4

Należy zauważyć, że nie jest * określony * wszędzie, gdzie 'StringJoiner' opiera się na' StringBuilder'. W szczególności w OpenJDK9 jest zoptymalizowany i nie używa już 'StringBuilder'. –

+1

@TagirValeev Tak, opierałem tę informację na czytaniu bieżącego kodu źródłowego. – RealSkeptic

1

str1 + " " + str2 wewnętrznie przekształcony:

StringBuffer tmp1 = new StringBuffer(); 
tmp1.append(str1); 
tmp1.append(" "); 
String tmp2 = tmp1.toString(); 
StringBuffer tmp3 = new StringBuffer(); 
tmp3.append(tmp2); 
tmp3.append(str2); 
String result = tmp3.toString(); 

str1.concat(str2) nie dają ten sam efekt, jak przestrzeń przyzwyczajenie się pomiędzy obu łańcuchów.

przyłączenia powinien być równy

StringBuffer tmp1 = new StringBuffer(); 
tmp1.append(str1); 
tmp1.append(" "); 
tmp1.append(str2); 
String result = tmp.toString(); 

a zatem szybciej.

+5

'+' jest konwertowane na 'StringBuilder', a nie' StringBuffer'. To samo dotyczy 'join'. – Jeffrey

Powiązane problemy