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.