scala.collections.mutable.ArrayBuilder和scala.collections.mutable.ArrayBuffer有什麼區別?如果,例如,我需要建立一個Array [Int],這是可取的使用?有沒有性能差異,就像在java.lang.StringBuffer和java.lang.StringBuilder中一樣?ArrayBuffer vs ArrayBuilder in scala
27
A
回答
38
ArrayBuilder
是Builder
,並且構建者意圖用於通過向其添加元素來構建其他集合。建設者通常不是直接用於客戶端代碼。
ArrayBuffer
是Buffer
和Seq
- 緩衝區是您可以有效追加元素的序列。序列帶有很多輔助操作。
您可能需要一個ArrayBuffer
。它旨在用作Java的ArrayList
的替代品。所述ArrayBuffer
類是與所有像foreach
,map
,filter
,zip
和朋友,不像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
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
相關問題
- 1. 無鍋板Scala ArrayBuilder專業化
- 2. 瞭解Scala中的ArrayBuffer
- 3. 在Scala中排序ArrayBuffer [A]?
- 4. Scala XML:Descendant vs Child
- 5. 基於隊列的Scala Filter ArrayBuffer
- 6. map3 in scala in Parallelism
- 7. scala:如何將ArrayBuffer轉換爲Set?
- 8. 初始化Scala ArrayBuffer的慣用方法?
- 9. map2 in scala in Exeption處理
- 10. scala sort indexedseq in
- 11. 如何使ArrayBuffer
- 12. Scala XML with&in CDATA
- 13. inline asm in C++ in vs __asm
- 14. concat in FSharp.Core.String vs Concat in System.String
- 15. AS3 - for(... in ...)vs for each(... in ...)
- 16. Datagrid in vs 2010
- 17. $ injector.instantiate VS $ injector.get VS $ injector.invoke in angularjs
- 18. 奇怪的ArrayBuffer行爲
- 19. Scala - TrieMap vs Vector
- 20. Scala StandardTokenParsers vs JavaTokenParsers
- 21. Scala vals vs vars
- 22. Scala classOf vs getClass
- 23. 將Seq轉換爲ArrayBuffer
- 24. float vs int in cuda
- 25. map vs hash_map in C++
- 26. $(this)vs this in jQuery
- 27. instance_eval vs class_eval in module
- 28. .isEqualTo vs .equals in java
- 29. apply()vs. sweep()in R
- 30. task.continuewith vs dataflow in c#
簡短的回答是,'Builder'的(半)內部類主要針對那些寫新集合類(無論是標準庫的一部分還是其擴展)。 – 2013-04-05 20:23:21
很好的答案。在我看來,我需要一個ArrayBuilder:我需要在while循環中添加元素到'something',然後在Array中轉換這個'something'(它必須是一個數組,用於java互操作性)。這個'東西'應該是一個基於這個信息的ArrayBuilder。 – 2014-02-04 09:49:54
如果您知道元素的確切原始類型,請使用'ArrayBuilder'來獲取適當的數組類型。如果你使用'ArrayBuffer',你仍然可以使用技巧來獲取數組,但是從Java的角度來看,它的類型是Object [],即Scala中的Array [AnyRef]。 。 – axel22 2014-02-04 18:08:18