2015-08-04 19 views
8

Tôi đã đọc nhanh tài liệu Java8 String api.String.join() so với các hoạt động nối chuỗi khác

Bây giờ tôi hơi tò mò về phương thức String.join() cho chuỗi concat/join.

Đây là loại ví dụ đã giúp tôi hiểu rõ hơn, mặc dù:

//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); 

Tuy nhiên, tôi không hiểu cái nào tôi nên sử dụng. Có hiệu suất hay khác biệt nào giữa hai quy trình này không.

Mọi trợ giúp sẽ được đánh giá cao.

+2

'concat' không chiêm ngưỡng dấu phân cách và' nối' có thể được thực hiện qua nhiều chuỗi. Cũng lưu ý rằng việc ghép nhiều với + có thể không dẫn đến hoạt động 'concat' trên chuỗi. –

Trả lời

14

String.join dựa trên lớp StringJoiner tự nó dựa trên nội bộ StringBuilder để tạo chuỗi đã tham gia.

Vì vậy, hiệu suất-khôn ngoan nó cũng tương tự như sử dụng một StringBuilder và phụ thêm vào nó, hoặc sử dụng một chuỗi các + (mà ngày nay được chuyển đổi thành StringBuilder hoạt động bởi trình biên dịch).

Nhưng tầm quan trọng của String.join không phải là một sự thay thế chung của + hoặc String.concat, nhưng trong là "hoạt động ngược lại" của một hoạt động String.split. Nó có ý nghĩa hơn trong ngữ cảnh đó - khi bạn có một chuỗi các chuỗi mà bạn muốn kết hợp với nhau bằng cách sử dụng dấu tách - thay vì thay thế cho concat.

Đó là, để xây dựng một sản lượng như "a/b/c/d" hoặc "(a+b+c+d)" khi bạn có a, b, cd trong một mảng hoặc một danh sách, String.join hay StringJoiner sẽ làm cho hoạt động rõ ràng và dễ đọc.

+4

Lưu ý rằng nó không được chỉ định * ở bất kỳ đâu mà 'StringJoiner' dựa vào' StringBuilder'. Đặc biệt trong OpenJDK9 nó được tối ưu hóa và không sử dụng 'StringBuilder' nữa. –

+1

@TagirValeev Có, tôi đã dựa vào thông tin đó để đọc mã nguồn hiện tại. – RealSkeptic

1

str1 + " " + str2 được chuyển đổi thành:

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) sẽ không tạo ra kết quả tương tự, như không gian sẽ không có mặt giữa hai chuỗi.

tham gia nên tương đương với

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

và do đó được nhanh hơn.

+5

'+' được chuyển đổi thành 'StringBuilder', không phải là' StringBuffer'. Tương tự cho 'tham gia'. – Jeffrey

Các vấn đề liên quan