2011-10-25 32 views
11

Sự khác biệt giữa hai dòng này là gì?StringBuilder nối thêm +

stringBuilder.append("Text " + counter + " more text"); 
stringBuilder.append("Text ").append(counter).append(" more text"); 

Giả sử truy cập được một int incrementing, không dòng đầu tiên tạo ra một String "Text 0 more text", "Text 1 more text" vv mỗi lần nó được gọi là, trong khi dòng thứ hai tạo ra chỉ có hai Strings những lần: "Text "" more text"? Điều này có đúng không?

Trả lời

15

Tóm lại, có, ngoại trừ các chuỗi ký tự cùng một chuỗi cho "Text "" more text" được sử dụng lại mỗi lần.

Biến thể thứ hai hiệu quả hơn vì nó viết từng thành phần trong ba thành phần trực tiếp vào StringBuilder.

Ngược lại, biến thể đầu tiên tạo tên khác - chưa đặt tên - StringBuilder, viết ba thành phần vào nó, gọi phương thức toString() và ghi kết quả vào tên stringBuilder.

Tóm lại, biến thể đầu tiên tạo thêm một đối tượng StringBuilder và thêm một đối tượng String và sao chép dữ liệu chuỗi hai lần so với biến thể thứ hai.

3

Có điều này là (chủ yếu) là chính xác.

Thực tế, thứ hai không tạo ra chuỗi mới, vì nó sử dụng lại các chuỗi giống nhau mỗi lần. Nó sẽ sử dụng các phiên bản nội bộ của chuỗi "Văn bản" và "văn bản khác".

Đầu tiên sẽ tạo chuỗi cho "Văn bản 1 văn bản khác", sau đó "Văn bản 2 văn bản khác", bằng cách sử dụng một StringBuilder được tạo bởi trình biên dịch.

1

Có, cách diễn giải của bạn gần như chính xác.

Dòng đầu tiên luôn tạo ra một đối tượng String như "Text 0 more text", trong khi thứ hai không không tạo ra một đối tượng như vậy String.

Dòng thứ hai không tạo * bất kỳ * String đối tượng ở tất cả các "Text "" more text"String literals rằng không get tái tạo mỗi lần dòng đó được thực thi. Chúng chỉ được tạo một lần.

Hiệu ứng trên stringBuilder hoàn toàn giống nhau trong cả hai trường hợp.

1

Nó gần như là chính xác.

Tôi muốn nói nhiều hơn. Vì chuỗi java lưu trữ tất cả các chuỗi được mã hóa cứng, thể hiện chuỗi "Văn bản" và "văn bản khác" không được tạo trên mỗi lần lặp.

1

Điều đó phụ thuộc vào việc Java có tập các chuỗi hay không, nhưng nó vẫn không hiệu quả.

Chuỗi không thay đổi, vì vậy, nếu bạn sử dụng .append ("String" + something + "String"), bạn buộc Java tạo một chuỗi các chuỗi mới để nó có thể kết thúc với chuỗi cuối cùng để thêm vào đệm. Đây là một bộ nhớ thường bị bỏ lỡ, và tôi đã thấy những cải tiến đáng kể trong việc sử dụng bộ nhớ trong các ứng dụng web bằng cách loại bỏ loại mã này.

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