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
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ỏ..)
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.
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.
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"
- 1. Có tốn kém trong Python để đưa các lớp vào các tệp khác nhau không?
- 2. File_exist() trong PHP là một hoạt động rất tốn kém?
- 3. Làm thế nào tốn kém là 'mở rộng' trong ruby?
- 4. Tùy chọn tốt cho nhà phát triển Java, những người cần Web Hosting không tốn kém
- 5. Hoạt động tốn kém của SQLite cursor.getCount trong Android
- 6. Việc triển khai các ứng dụng web Java có tốn kém hơn các ứng dụng web PHP khác không?
- 7. Bộ nhớ tốn kém như thế nào khi ghi dữ liệu vào AddressBook và CoreData?
- 8. Đang trả lại hàng tiêu chuẩn :: danh sách tốn kém?
- 9. Có ít tốn kém tính toán để sử dụng 7.0 hoặc float (7) bằng Python không?
- 10. Tại sao DateTime.Now DateTime.UtcBây giờ quá chậm/tốn kém
- 11. Quản lý bộ nhớ/bộ nhớ đệm cho các đối tượng tốn kém trong C#
- 12. Các sự kiện ràng buộc trong jQuery rất tốn kém hay rất rẻ?
- 13. Kết nối kém Couchbase (TIMING OUT) trong AWS VPC
- 14. Thời gian gọi điện thoại tốn kém (NULL) trong vòng lặp máy chủ là bao nhiêu?
- 15. Scala: Có cách nào để sử dụng PriorityQueue như tôi làm trong Java không?
- 16. Intel Xeon Phi có thể sử dụng được nếu không có một trình biên dịch Intel tốn kém không?
- 17. Điều gì khiến Erlang không phù hợp với công việc tốn kém về tính toán?
- 18. Tại sao không có nội suy chuỗi trong Scala?
- 19. Có tốn kém khi tính toán kích thước vectơ cho các vòng lặp, mỗi lần lặp không?
- 20. Hiệu quả nối chuỗi Java
- 21. Google App Engine - sao lưu và khôi phục cực kỳ chậm và tốn kém?
- 22. C# có một Trình mã hoá chuỗi như Java không?
- 23. Ghép nối chuỗi và hộp số tự động trong Java
- 24. Nội suy chuỗi trong Scala?
- 25. Có phải chờ đợi chuỗi chủ đề Scala Future không?
- 26. Tôi có thể có giá trị âm như biểu thức liên tục trong Scala không?
- 27. đang gọi libgdx SpriteBatch bắt đầu và kết thúc phương thức nhiều lần tốn kém?
- 28. Scala - Java interop: có thể Scala phát ra enums trong bytecode cho Java để tiêu thụ không?
- 29. nối chuỗi trong css
- 30. Tôi nên chỉ định loại dữ liệu không có cấu trúc giống như JSON trong Scala như thế nào?
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
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
@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