Trong Java có sự khác biệt về hiệu năng giữa việc sử dụng toán tử "+" và StringBuilder không?


Câu trả lời 1:

Trong Java có sự khác biệt về hiệu năng giữa việc sử dụng toán tử "+" và StringBuilder không?

Trên một dòng như sau:

Chuỗi String1 = Đăng một
Chuỗi String2 = new StringBuilder (Nhận một trong một).

Không nên có sự khác biệt trong hiệu suất. Trong thực tế, trong các hệ sinh thái Java hiện đại, cái đầu tiên được tối ưu hóa thành cái thứ hai vào thời gian biên dịch. Để thấy điều này trong thực tế, hãy thử bước vào lần đầu tiên bằng cách sử dụng trình gỡ lỗi yêu thích của bạn.

Tuy nhiên, nếu các chuỗi nối của bạn trên các dòng riêng biệt hoặc, giả sử, trong một vòng lặp for:

Chuỗi string1 =
StringBuilder sb = new StringBuilder ();

for (Số nguyên i = 0; i <5; i ++) {
  chuỗi1 = chuỗi1 + i.toString ();
  sb.append (i.toString ());
}

Chuỗi string2 = sb.toString ();

Sau đó, sử dụng StringBuilder là hiệu quả hơn nữa và đôi khi là cách ưa thích để xây dựng một chuỗi phức tạp hơn. Theo như tôi biết, hiện tại không có trình biên dịch Java nào sẽ tối ưu hóa việc lặp lại + thành StringBuilder.


Câu trả lời 2:

Câu trả lời ngắn gọn: có thể có, nhưng hầu hết thời gian nó không đáng lo ngại. Ưu tiên mã rõ ràng hơn tối ưu hóa sớm.

Các JVM hiện đại có thể tối ưu hóa nối chuỗi với "+" và biến nó thành StringBuilder và vì họ có thể thấy Chuỗi kết quả sẽ diễn ra trong bao lâu, nên họ có thể phân bổ kích thước chính xác cho StringBuilder khi bắt đầu. Nếu bạn tự tạo StringBuilder bằng kích thước mảng mặc định, mảng char có thể phải được mở rộng sau đó, liên quan đến một bản sao mảng, do đó thực sự có thể chậm hơn.

Kể từ Java 9, nối chuỗi được tối ưu hóa hơn nhiều, với chiến lược được quyết định khi chạy.

Nếu bạn liên tục thêm vào Chuỗi trong một vòng lặp, thì có lẽ bạn có thể sai khi sử dụng StringBuilder, nhưng hãy phân bổ kích thước chính xác trước nếu nó biết. Bên ngoài các vòng lặp, hãy gắn "+" bất cứ khi nào nó sẽ dễ đọc hơn; và tin tưởng rằng JVM là, hoặc sẽ sớm, tối ưu hóa tốt hơn bạn.