Sự khác biệt giữa scala.collections.mutable.ArrayBuilder và scala.collections.mutable.ArrayBuffer là gì? Nếu, ví dụ, tôi cần phải xây dựng một Array [Int], đó là thích hợp hơn để sử dụng? Có bất kỳ sự khác biệt về hiệu suất, như trong java.lang.StringBuffer và java.lang.StringBuilder không?ArrayBuffer vs ArrayBuilder trong scala
Trả lời
ArrayBuilder
là Builder
và nhà xây dựng có nghĩa là được sử dụng để xây dựng các bộ sưu tập khác bằng cách thêm các yếu tố vào chúng. Các nhà xây dựng thường không được sử dụng trực tiếp trong mã máy khách.
ArrayBuffer
là Buffer
và Seq
- bộ đệm là các chuỗi mà bạn có thể thêm phần tử hiệu quả vào đó. Trình tự đi kèm với rất nhiều hoạt động phụ trợ.
Có thể bạn cần một ArrayBuffer
. Nó được dùng để thay thế cho ArrayList
trong Java. Lớp ArrayBuffer
là một đầy đủ-powered sưu tập liên tục với tất cả các hoạt động dữ liệu với số lượng lớn như foreach
, map
, filter
, zip
và bạn bè, không giống như ArrayBuilder
được trang bị chỉ với +=
để thêm các yếu tố và result
để có được những mảng ở cuối.
Một nơi mà bạn có thể thích ArrayBuilder
là khi bạn đang khởi tạo nó cho loại nguyên thủy như Int
và bạn quan tâm đến hiệu suất. Trong trường hợp này, các biến thể ArrayBuilder
chuyên biệt cho các kiểu nguyên thủy khác nhau và giữ một mảng cơ bản của một kiểu nguyên thủy thích hợp, trong khi ArrayBuffer
luôn giữ một mảng đối tượng bên dưới - mỗi nguyên thủy bạn thêm vào nó trải qua boxing.
Để tạo một bộ đệm mảng:
new ArrayBuffer[Int] // gives you an array buffer that will hold boxed integers
Để nhanh chóng một người xây dựng mảng:
new ArrayBuilder.ofInt // gives you a manually specialized array builder that will hold real primitives
Tôi hẹn giờ nó và xây dựng một mảng với ArrayBuilder
là nhanh hơn trông thấy:
Với ArrayBuffer
:
real 0m40.348s
user 0m29.544s
sys 0m1.017s
Với Array Builder
:
real 0m8.392s
user 0m4.769s
sys 0m0.330s
Mã của tôi:
import scala.collection.mutable.{ArrayBuffer, ArrayBuilder}
object MyObject {
def main(args: Array[String]) {
for (i <- 0 until 100) {
arrayBuilderMade
// or arrayBufferMade
}
}
def arrayBufferMade {
var aBuffer = new ArrayBuffer[Int]()
for (i <- 0 until 1000000) {
aBuffer += i
}
println(aBuffer.toArray.length)
}
def arrayBuilderMade {
var aBuilder = new ArrayBuilder.ofInt
for (i <- 0 until 1000000) {
aBuilder += i
}
println(aBuilder.result.length)
}
}
Và
time scala my_code.scala
- 1. ArrayBuffer vs Blob và XHR2
- 2. Scala: fold vs foldLeft
- 3. Chuyên gia Scala ArrayBuilder không có Boilerplate miễn phí
- 4. Chuyển đổi Seq thành ArrayBuffer
- 5. monoid vs monad trong Scala
- 6. loại tham số Thiếu cho chức năng mở rộng trong Scala ArrayBuffer
- 7. scala - array vs arrayseq
- 8. Scala classOf vs getClass
- 9. Scala - infix vs dot notation
- 10. Thay đổi kích thước ArrayBuffer
- 11. Đối tượng gói Scala vs Predef
- 12. scala actors vs thread và chặn IO
- 13. danh sách Scala chứa vs mảng chứa
- 14. Chức năng Scala vs Class Dichotomy
- 15. Chuỗi Scala vs java.lang.String - kiểu suy luận
- 16. scala: 'foo def = {1}' vs 'foo def {1}'
- 17. Làm cách nào để nhận chuỗi nhị phân từ ArrayBuffer?
- 18. Chơi tư vấn scala về anorm vs slick
- 19. scala vấn đề thừa kế: val vs def
- 20. Scala AST trong Scala
- 21. Ruby vs Scala - ưu và contras của mỗi người
- 22. Scala currying vs các hàm được áp dụng một phần
- 23. Chơi Scala Json Thiếu tài sản vs Null
- 24. WebSocket thông điệp dữ liệu nhị phân (ArrayBuffer)
- 25. Làm thế nào để đi từ Blob để ArrayBuffer
- 26. jQuery $ .ajax hoặc $ .load có cho phép responseType arrayBuffer không?
- 27. Xáo trộn một phần của một ArrayBuffer tại chỗ
- 28. Cách sử dụng các bộ sưu tập có thể thay đổi trong Scala
- 29. hiệu suất trong các thư viện scala logging gọi-by-value vs gọi bằng tên
- 30. java vs scala - đọc trong tập tin trên một chủ đề riêng biệt
Câu trả lời ngắn gọn là 'Builder' được (bán) các lớp học nội bộ có nghĩa là đối với những văn bản mới các lớp sưu tập (cho dù là một phần của thư viện chuẩn hoặc các phần mở rộng cho nó). –
Câu trả lời hay. Trong trường hợp của tôi, có vẻ như, tôi cần một ArrayBuilder: Tôi cần phải thêm các phần tử trong một vòng lặp while vào 'something', và sau đó biến đổi 'cái gì đó' này trong một Array (nó phải là một mảng, cho khả năng tương tác java). 'Cái gì đó' này sẽ là một ArrayBuilder, dựa trên thông tin này. –
Nếu bạn biết loại nguyên thủy chính xác cho các phần tử, hãy sử dụng một 'ArrayBuilder' để lấy lại một kiểu mảng thích hợp. Nếu bạn sử dụng 'ArrayBuffer', bạn vẫn có thể chơi các thủ thuật để lấy mảng ra khỏi nó, nhưng nó sẽ có kiểu' Object [] 'từ quan điểm Java, nghĩa là' Array [AnyRef] 'trong các thuật ngữ Scala . – axel22