2011-12-22 21 views
41

Trong Java, đó là cách thực hành tốt nhất để kết nối chuỗi với StringBuilder do hiệu năng kém của việc thêm chuỗi bằng cách sử dụng toán tử +. Có thực hành tương tự được khuyến nghị cho Scala hoặc có ngôn ngữ được cải thiện về cách java thực hiện chuỗi nối của nó không?Chuỗi nối trong scala có tốn kém như trong Java không?

Trả lời

36

Scala sử dụng chuỗi Java (java.lang.String), do đó, chuỗi nối của nó giống như của Java: cùng một điều đang diễn ra trong cả hai. (Thời gian chạy là như nhau, sau khi tất cả.) Có một lớp đặc biệt StringBuilder trong Scala, rằng "cung cấp một API tương thích với java.lang.StringBuilder"; xem http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html. Tuy nhiên, về mặt "thực hành tốt nhất", tôi nghĩ hầu hết mọi người thường nên viết mã đơn giản, rõ ràng hơn mã hiệu quả tối đa, trừ khi có vấn đề hiệu suất thực tế hoặc lý do tốt để mong đợi. Nhà điều hành + không thực sự có "hiệu suất kém", chỉ là s += "foo" tương đương với s = s + "foo" (tức là nó tạo đối tượng String mới), có nghĩa là, nếu bạn đang thực hiện nhiều kết nối (trông như thế nào) "một chuỗi duy nhất", bạn có thể tránh tạo các đối tượng không cần thiết — và lặp lại nhiều lần các phần trước đó từ một chuỗi này sang một chuỗi khác — bằng cách sử dụng một số StringBuilder thay vì String. Thông thường sự khác biệt không quan trọng. (Tất nhiên, "đơn giản, mã rõ ràng" là hơi mâu thuẫn: sử dụng += là đơn giản, sử dụng StringBuilder là rõ ràng hơn Nhưng vẫn còn, quyết định thường phải dựa trên mã viết cân nhắc chứ không phải cân nhắc hiệu suất nhỏ..)

+1

Trong trường hợp của tôi, tôi rất lo ngại về hiệu suất vì thế tại sao tôi đặt ra câu hỏi. Cảm ơn tất cả các thông tin! – bionicseraph

+0

AFAIK, JVM tự động xử lý các liên kết '+' lặp lại trong một biểu thức giống như cách nó sẽ thực hiện một chuỗi ký tự xâu chuỗi. Vì vậy, không có sự khác biệt hiệu suất thực sự. – aishwarya

+0

@aishwarya: JLS khuyến cáo rằng các trình biên dịch tối ưu hóa 'foo + bar + baz + bip' thành tương đương với' new StringBuilder (foo) .append (bar) .append (baz) .append (bip) .toString() 'và '" foo "+" bar "+" baz "+" bip "' đến '" foobarbazbip "', nhưng đó là những trường hợp khá hẹp. Và tôi không nghĩ rằng các JVM (trái ngược với các trình biên dịch) thường làm bất kỳ loại tối ưu hóa nào dọc theo các dòng đó, mặc dù tôi có thể sai. – ruakh

2

Scala sử dụng java.lang.String làm loại cho chuỗi, do đó, nó phải chịu cùng đặc điểm.

19

Ghép nối chuỗi hoạt động giống như cách Javas thực hiện.

val x = 5 
"a"+"b"+x+"c" 

được phiên dịch sang

new StringBuilder()).append("ab").append(BoxesRunTime.boxToInteger(x)).append("c").toString() 

StringBuilder là scala.collection.mutable.StringBuilder. Đó là lý do tại sao giá trị được thêm vào StringBuilder được đóng gói bởi trình biên dịch.

Bạn có thể kiểm tra hành vi bằng cách dịch ngược mã byte bằng javap.

2

tôi muốn thêm: nếu bạn có một chuỗi các chuỗi, sau đó đã có một phương pháp để tạo ra một chuỗi mới ra khỏi chúng (tất cả các mục, nối). Nó được gọi là mkString.

Ví dụ: (http://ideone.com/QJhkAG)

val example = Seq("11111", "2222", "333", "444444") 
val result = example.mkString 
println(result) // prints "111112222333444444" 
Các vấn đề liên quan