2011-12-18 39 views
14

Tôi đã đọc trang tài liệu này, http://developer.android.com/reference/android/util/Log.html.Android StringBuilder vs String Ghép nối

Phần đây bắt mắt tôi:

Lời khuyên: Đừng quên rằng khi bạn thực hiện cuộc gọi như

Log.v(TAG, "index=" + i);

rằng khi bạn đang xây dựng chuỗi để vượt qua thành Log.d, trình biên dịch sử dụng một StringBuilder và ít nhất ba phân bổ xảy ra: StringBuilder chính nó, bộ đệm và đối tượng String. Thực tế, cũng có một cấp phát đệm và bản sao khác, và thậm chí nhiều áp lực hơn đối với gc. Điều đó có nghĩa là nếu thông báo tường trình của bạn bị lọc ra, bạn có thể đang thực hiện công việc quan trọng và phát sinh chi phí đáng kể.

Điều này ngụ ý rằng trình biên dịch Android đang lấy chuỗi nối (+) và chuyển đổi chúng thành StringBuilder và nối thêm câu lệnh.

Giả sử của tôi có đúng hay không thì tốt hơn là sử dụng StringBuilder theo cách thủ công thay vì nối chuỗi không?

+0

thể trùng lặp của [String nối trong Java - khi sử dụng +, StringBuilder và concat] (http://stackoverflow.com/ question/7817951/string-concatenation-in-java-khi-to-use-stringbuilder-and-concat) – givanse

Trả lời

9

Trình biên dịch thực hiện chính xác những gì bạn đề xuất được ngụ ý. Bạn có thể in các bytecode của tệp .class được tạo ra (sử dụng javap -c) và xem các cuộc gọi để xây dựng và sử dụng một StringBuilder.

Tuy nhiên, thường có giá trị khi thực hiện thủ công khi chuỗi nối được trải rộng trên nhiều dòng mã. Trình biên dịch thường phân bổ StringBuilder riêng cho mỗi biểu thức có giá trị Chuỗi liên quan đến +.

+0

Tôi đã làm điều đó sai tất cả thời gian này. >< –

+1

@JeremyEdwards - Heh. Tôi đã nói về rất nhiều thứ. :) –

+2

** "nó thường có giá trị thực hiện nó theo cách thủ công khi chuỗi nối được trải rộng trên nhiều dòng mã" ** - Tôi chỉ muốn nhấn mạnh những gì @TedHopp nói để nó không bị mất. Tôi đã ghép một chuỗi ký tự 250 trên khoảng 10 dòng và thời gian cpu trên App Engine là 350 mili giây. Khi tôi thay thế điều này bằng một StringBuilder duy nhất, thời gian đã giảm xuống còn 50 msec, những thứ khác không thay đổi. –

1

Câu trả lời của Ted Hopp là tốt, nhưng nó đã đọc nó một vài lần để hiểu. Đây là một câu trả lời được lặp lại, hy vọng rõ ràng hơn.

Nối chuỗi (ví dụ: sử dụng +, như trong String myString = "Hello " + "World";) sử dụng StringBuilder ở chế độ nền cùng với các phân bổ khác. Vì vậy, đối với bất kỳ điều gì khác hơn là ghép nối một lần đơn giản, tốt hơn bạn nên tự sử dụng một số StringBuilder.

Ví dụ,

StringBuilder myString = new StringBuilder(); 
myString.append("Hello "); 
myString.append("to "); 
myString.append("everyone "); 
myString.append("in "); 
myString.append("the "); 
myString.append("world!"); 

là tốt hơn so với

String myString = "Hello " + "to " + "everyone " + "in " + "the " + "world!"; 
+0

Nhưng nếu chuỗi của tôi chỉ là '' index = "+ i ', cách tốt nhất là gì?(Đối với hiệu suất) – GMX

+0

@GMX, Đó là một câu hỏi hay và tôi nghĩ nó sẽ phụ thuộc vào ngữ cảnh. Nếu điều này chỉ được gọi là không thường xuyên, sau đó sử dụng '" index = "+ i' là dễ đọc hơn nhiều so với sử dụng một' StringBuilder'. Tuy nhiên, nếu nó được gọi là 1000 lần bên trong của một vòng lặp và hiệu suất là một vấn đề, sau đó có thể một số loại 'StringBuilder' tùy chọn sẽ được tốt hơn. Tuy nhiên, điểm chính của câu trả lời được chấp nhận là khi cần nhiều dòng mã để xây dựng một chuỗi, thì chắc chắn sử dụng một 'StringBuilder'. – Suragch

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