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 StringBuilder
và String
. 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.
Nguồn
2013-08-26 21:40:42
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. –