Yanıtlar:
Scala List
Eğer (muhtemelen) bir çok daha bunu kullanarak olmalıdır, Scala böyle bir temel yapısı olan değişmez bir özyinelemeli veri yapısıdır Array
(aslında hangi değişken - değişmez analog ait Array
olduğunu IndexedSeq
).
Eğer bir Java arka plandan geliyorsanız ne zaman kullanılacağına, daha sonra bariz paralel LinkedList
üzerinde ArrayList
. Birincisi genel olarak yalnızca geçilen (ve boyutu önceden bilinmeyen) listeler için kullanılırken ikincisi, bilinen bir boyuta (veya maksimum boyuta) sahip olan veya hızlı rasgele erişimin önemli olduğu listeler için kullanılmalıdır .
ListBuffer
daha sonra bu tür bir dönüşüm gerekiyorsa List
kullanmak için tek neden olan bir sabit zamanlı dönüşüm sağlar ListBuffer
.
JVM'de Array
bir Java dizisi tarafından bir scala uygulanmalıdır ve bu nedenle bir Array[Int]
, a'dan çok daha fazla performans gösterebilir (an olarak int[]
) List[Int]
(Scala'nın yeni @specialized
özelliğe sahip en son sürümlerini kullanmıyorsanız, içeriğini kutlayacak ) .
Bununla birlikte, Array
Scala'da s kullanımının minimumda tutulması gerektiğini düşünüyorum, çünkü dizinizin gerçekten gerekli ilkel tip tarafından desteklenip desteklenmeyeceğine karar vermek için gerçekten kaputun altında neler olup bittiğini bilmeniz gerekiyor gibi görünüyor veya ambalaj tipi olarak kutulu olmalıdır.
Daha önce gönderilen cevaplara ek olarak, bazı özellikler aşağıda verilmiştir.
A Array[A]
tam anlamıyla bir Java dizisi olsa da, a (boş liste) olan veya bir çiftten oluşan List[A]
değişmez bir veri yapısıdır .Nil
(A, List[A])
Performans farklılıkları
Array List
Access the ith element θ(1) θ(i)
Delete the ith element θ(n) θ(i)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Count the elements θ(1) θ(n)
Bellek farklılıkları
Array List
Get the first i elements θ(i) θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Eğer hızlı rastgele erişime gerekmedikçe Yani, elemanlarını saymak gerekir, ya da herhangi bir nedenle bir yıkıcı güncelleştirmeleri gerek List
iyi bir daha Array
.
list = list.drop(i)
. Veya, kaputun arkasında biraz sihir mi oluyor?
drop
asla listenin bırakılmayan kısmını kopyalaması gerekmediğini unutmayın . Örneğin (x::xs).drop(1)
, xs
bir "kopyası" değildir xs
.
Bir Dizi değiştirilebilir, yani her dizinin değerlerini değiştirebilirsiniz; Liste (varsayılan olarak) değiştirilemez, yani her değişiklik yaptığınızda yeni bir liste oluşturulur. Çoğu durumda bu değişmez veri türleri ile çalışmak için daha "işlevsel" tarzıdır ve muhtemelen denemek ve benzeri yapılara sahip bir listesi kullanmalıdır yield
, foreach
, match
vb.
Performans karakteristikleri için, Array öğelere rastgele erişimle daha hızlı olurken, yeni öğeleri eklerken (eklerken) Liste daha hızlıdır. Onları tekrarlamak karşılaştırılabilir.
iterate over
, önbellek nedeniyle listeden çok daha hızlı performans gösterir