2013-04-05 24 views
27

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

38

ArrayBuilderBuilder 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.

ArrayBufferBufferSeq - 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 
+2

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ó). –

+3

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. –

+0

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

6

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) 
    } 
} 

time scala my_code.scala 
Các vấn đề liên quan