2013-08-26 27 views
26

Lợi ích và thương mại của việc sử dụng trình tạo chuỗi trên nối chuỗi thuần túy là gì?Trình tạo chuỗi so với nối chuỗi

new StringBuilder(32).append(str1) 
        .append(" test: ") 
        .append(val) 
        .append(" is changed") 
        .toString(); 

vs nói

str1 + " test: " + val + " is changed". 

str1 là một chuỗi 10 kí tự ngẫu nhiên. str2 là chuỗi ký tự 8 ngẫu nhiên.

+0

Trong ví dụ tầm thường của bạn, có thể không có lợi ích. StringBuilders rất hữu ích bởi vì, khi bạn concat với + bạn tạo ra các chuỗi thương hiệu mới mỗi khi bạn concat. StringBuilder do đó hiệu quả hơn cho concat'ing số lượng lớn các chuỗi. –

Trả lời

49

Trong ví dụ tầm thường của bạn, không vì trình biên dịch sử dụng StringBuilder để thực hiện ghép nối Chuỗi. Tuy nhiên, nếu việc ghép nối xảy ra trong một vòng lặp, trình biên dịch có thể tạo ra một số đối tượng StringBuilderString. Ví dụ:

String s= "" ; 
for(int i= 0 ; i < 10 ; i++) 
    s+= "a" ; 

Mỗi lần dòng 3 trên được thực thi, một đối tượng StringBuilder được tạo ra, các nội dung của s nối, "a" nối, và sau đó là StringBuilder được chuyển đổi thành một String để được chỉ định trở lại s . Tổng cộng có 10 StringBuilder s và 10 String s.

Ngược lại, trong

StringBuilder sb= new StringBuilder() ; 
for(int i= 0 ; i < 10 ; i++) 
    sb.append("a"); 
String s= sb.toString() ; 

Chỉ 1 StringBuilder và 1 String được tạo ra.

Lý do chính cho điều này là trình biên dịch không đủ thông minh để hiểu rằng vòng lặp đầu tiên tương đương với vòng lặp thứ hai và tạo mã (byte) hiệu quả hơn. Trong trường hợp phức tạp hơn, nó không thể ngay cả đối với trình biên dịch thông minh nhất để biết. Nếu bạn hoàn toàn cần tối ưu hóa này, bạn phải giới thiệu nó theo cách thủ công bằng cách sử dụng một cách rõ ràng StringBuilder s.

4

Câu trả lời nhanh là việc thực hiện: khi bạn đang sử dụng các lớp Chuỗi mẹ đẻ nó hoạt động chuỗi bất biến, có nghĩa là khi bạn đang viết

String line = "java"; 
    String sufix = " is awesome"; 
    line = line + sufix; 

nó sẽ tạo ra hai chuỗi "java" và "là tuyệt vời" , hơn tạo một chuỗi thứ ba mới "java là tuyệt vời" từ hai trước ("java" và "tuyệt vời") mà sau này có khả năng bị xóa bởi bộ thu gom rác (vì chúng không còn được sử dụng trong ứng dụng) nữa. Đó là một giải pháp chậm.

Giải pháp nhanh hơn là thiết bị của lớp StringBuffer thông qua các thuật toán thông minh cung cấp bộ đệm (rõ ràng từ tên của nó) để kết hợp chuỗi và kết quả là sẽ không xóa chuỗi ban đầu trong quá trình nối.

Trong trường hợp bạn đang viết đơn đề đơn (không có vấn đề concurrancy trong đó nhiều chủ đề truy cập cùng một đối tượng) tốt hơn là áp dụng StringBuilder có hiệu suất nhanh hơn so với lớp StringBuffer ban đầu.

+0

Xin chào, như Chủ đề cấu trúc dữ liệu an toàn, bạn đề nghị sử dụng phiên bản An toàn Chủ đề của Trình dựng Chuỗi trong thực thi đa luồng? – nmxprime