2013-04-05 123 views
27

scala.collections.mutable.ArrayBuilder和scala.collections.mutable.ArrayBuffer有什麼區別?如果,例如,我需要建立一個Array [Int],這是可取的使用?有沒有性能差異,就像在java.lang.StringBuffer和java.lang.StringBuilder中一樣?ArrayBuffer vs ArrayBuilder in scala

回答

38

ArrayBuilderBuilder,並且構建者意圖用於通過向其添加元素來構建其他集合。建設者通常不是直接用於客戶端代碼。

ArrayBufferBufferSeq - 緩衝區是您可以有效追加元素的序列。序列帶有很多輔助操作。

您可能需要一個ArrayBuffer。它旨在用作Java的ArrayList的替代品。所述ArrayBuffer類是與所有像foreachmapfilterzip和朋友,不像ArrayBuilder其僅與+=配備添加元素和result批量數據操作以獲得在末端陣列完全供電的序列集合。

您可能更喜歡ArrayBuilder的一個地方是當您將它初始化爲原始類型(如Int)並且您關心性能時。在這種情況下,ArrayBuilder變體專門針對不同的基元類型,並保存一個適當基元類型的基礎數組,而一個ArrayBuffer總是在下面保存一個對象數組 - 每個添加到它的基元都經歷裝箱。

要實例的陣列緩衝液:

new ArrayBuffer[Int] // gives you an array buffer that will hold boxed integers 

要實例的陣列構建:

new ArrayBuilder.ofInt // gives you a manually specialized array builder that will hold real primitives 
+2

簡短的回答是,'Builder'的(半)內部類主要針對那些寫新集合類(無論是標準庫的一部分還是其擴展)。 – 2013-04-05 20:23:21

+3

很好的答案。在我看來,我需要一個ArrayBuilder:我需要在while循環中添加元素到'something',然後在Array中轉換這個'something'(它必須是一個數組,用於java互操作性)。這個'東西'應該是一個基於這個信息的ArrayBuilder。 – 2014-02-04 09:49:54

+0

如果您知道元素的確切原始類型,請使用'ArrayBuilder'來獲取適當的數組類型。如果你使用'ArrayBuffer',你仍然可以使用技巧來獲取數組,但是從Java的角度來看,它的類型是Object [],即Scala中的Array [AnyRef]。 。 – axel22 2014-02-04 18:08:18

6

我計時,並建立一個數組ArrayBuilder是明顯快:

隨着ArrayBuffer

real 0m40.348s 
user 0m29.544s 
sys 0m1.017s 

隨着Array Builder

real 0m8.392s 
user 0m4.769s 
sys 0m0.330s 

我的代碼:

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