2010-01-13 23 views
6

Bất cứ khi nào tôi cố gắng thêm những con số trong chuỗi như:Speed ​​vấn đề trong khi phụ thêm chuỗi

String s=new String(); 

for(int j=0;j<=1000000;j++) 

    s+=String.valueOf(j); 

Chương trình của tôi sẽ bổ sung những con số, nhưng rất chậm. Nhưng khi tôi thay đổi chương trình của mình và làm như sau:

StringBuffer sb=new StringBuffer(); 

for(int j=0;j<=1000000;j++) 

sb.append(String.valueOf(j)); 

Tôi nhận được kết quả rất nhanh. Tại sao vậy?

+0

http://www.joelonsoftware.com/ articles/fog0000000319.html – moonshadow

+0

Tôi có thể đề nghị bạn đọc hiệu quả Java http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683 Cuốn sách này sẽ bao gồm kiến ​​thức cơ bản về lập trình Java. Nếu bạn có thêm câu hỏi, bạn vẫn có thể quay lại đây, tất nhiên là – nanda

+0

Sẽ nhanh hơn nếu bạn kích thước trước StringBuffer: 'StringBuffer sb = new StringBuffer (5888896); ' Sau đó, nó có thể nhận * hơi * nhanh hơn một lần nữa nếu bạn thay đổi thành 'StringBuilder'. Ngẫu nhiên, bạn chỉ có thể sử dụng 'sb.append (j);' để nối thêm số. –

Trả lời

6

s+=String.valueOf(j); cần phân bổ đối tượng String mới mỗi lần được gọi và điều này là tốn kém. Các StringBuffer chỉ cần phát triển một số đại diện nội bộ khi chuỗi chứa quá lớn, xảy ra ít thường xuyên hơn nhiều.

Có thể sẽ còn nhanh hơn nếu bạn sử dụng StringBuilder, đây là phiên bản không được đồng bộ hóa của StringBuffer.

Một điều cần lưu ý là trong khi điều này không áp dụng đối với các vòng lặp và nhiều trường hợp khác, nó không nhất thiết phải áp dụng cho tất cả các trường hợp Strings được nối bằng +:

String helloWorld = getGreeting() + ", " + getUsername() + "!"; 

Ở đây, trình biên dịch có thể sẽ tối ưu hóa mã theo cách mà nó thấy phù hợp, có thể hoặc không thể tạo ra một StringBuilder, vì đó cũng là một hoạt động tốn kém.

+0

+1 cho StringBuilder. Bạn cũng có thể cấp phát bộ nhớ cho nó (tham số cho hàm dựng). – Thilo

1

Vì s + = "string" tạo một phiên bản mới. Chuỗi là không thay đổi. StringBuffer hoặc StringBuilder thêm String mà không tạo một cá thể mới.

1

Trong Java như trong .NET Strings là không thay đổi. Chúng không thể thay đổi sau khi tạo. Kết quả là việc sử dụng toán tử + sẽ tạo một chuỗi mới và sao chép nội dung của cả hai chuỗi vào đó.

Chuỗi StringBuffer sẽ nhân đôi không gian được phân bổ mỗi khi hết dung lượng để thêm ký tự. Do đó giảm số lượng cấp phát bộ nhớ.