Scala эквивалент java.утиль.список ArrayList
Я делаю проект в Scala, но я довольно новичок в языке и имею фон Java. Я вижу, что у Scala нет ArrayList, поэтому мне интересно, какой эквивалент Scala ArrayList Java называется, и есть ли какие-либо важные различия между версиями Java и Scala.
EDIT: Я не ищу конкретное поведение, а внутреннее представление (данные хранятся в массиве, но весь массив не виден, только часть вас использовать.)
4 ответа:
я могу придумать 3 более конкретных вопроса для решения вашего:
- что такое коллекция Scala по умолчанию?
- какая коллекция Scala имеет характеристики, похожие на
ArrayList
?- какая хорошая замена для
Array
в Scala?Итак, вот ответы на них:
что такое коллекция Scala по умолчанию?
Scala эквивалент Java
List
интерфейсSeq
. А еще существует также общий интерфейс, который являетсяGenSeq
-- главное отличие в том, чтоGenSeq
операции могут обрабатываться последовательно или параллельно, в зависимости от реализации.потому что Scala позволяет программистам использовать
Seq
как фабрика, они не часто утруждают себя определением конкретной реализации, если они не заботятся об этом. Когда они это делают, они обычно выбирают либо ScalaList
илиVector
. Они оба неизменны, иVector
хорошо индексированный доступ спектакль. С другой стороны,List
делает очень хорошо операции он делает хорошо.какая коллекция Scala имеет характеристики, похожие на
ArrayList
?что будет
scala.collection.mutable.ArrayBuffer
.какая хорошая замена для
Array
в Scala?ну, хорошая новость в том, что вы можете просто использовать
Array
в Scala! В Java,Array
часто избегается из-за своей общей несовместимости с дженериками. Это коллекция co-variant, тогда как дженерики инвариантный, он изменчив - что делает его ко-дисперсию опасной, он принимает примитивы, где дженерики этого не делают, и у него довольно ограниченный набор методов.В Scala,
Array
- это все тот жеArray
как и в Java -- является инвариантным, что делает большинство проблем уйти. Скала принимаетAnyVal
(эквивалент примитивов) как типы для его "дженериков", хотя он будет делать авто-бокс. И через шаблон "обогатить мою библиотеку",все ofSeq
методы доступны дляArray
.Итак, если вы хотите более мощный
Array
, просто использоватьArray
.насчет коллекции, которая сжимается и растет?
методы по умолчанию, доступные для всех коллекций все производят новая коллекций. Например, если я сделаю это:
val ys = xs filter (x => x % 2 == 0)
затем
ys
будет новая сбор, в то время какxs
по-прежнему будет такой же, как и до этой команды. Это правда, несмотря ни на чтоxs
было:Array
,List
и т. д.естественно, это имеет стоимость -- в конце концов, вы are создание новой коллекции. Неизменяемые коллекции Scala намного лучше справляются с этой стоимостью, потому что они постоянные, но это зависит от того, какая операция выполняется.
никакая коллекция не может сделать много о
filter
, аList
имеет отличную производительность при создании новой коллекции путем добавления элемента или удаления головки -- основные операции стека, по сути.Vector
имеет хорошее представление на кучу операций, но он платит только если коллекция не маленькая. Для коллекций, скажем, до ста элементов, общая стоимость может превышать прибыль.таким образом, вы можете добавлять или удалять элементы в
Array
, и Scala произведет новаяArray
для вас, но вы будете платить стоимость полной копии, когда вы это сделаете.Scala изменяемые коллекции добавить несколько других методов. В частности, коллекции, которые могут увеличивать или уменьшать размер -- без создания новой коллекции -- реализовать
Growable
иShrinkable
черты характера. Однако они не гарантируют хорошую производительность при этих операциях, но они укажут вам на коллекции, которые вы хотите проверить.
Это
ArrayBuffer
сscala.collection.mutable
. Вы можете найти scaladocs здесь.
трудно точно сказать, что вы должны делать, потому что вы не сказали, какое поведение
ArrayList
вы заинтересованы в использовании. Более полезно думать о том, какие черты scala вы хотите использовать. Вот хорошее объяснение: http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html.тем не менее, вы, вероятно, хотите какой-то
IndexedSeq
.