На самом деле есть четыре различных класса, из которых вы можете выбрать функциональность, похожую на изменяемый массив.
Array + ArrayOps
WrappedArray
ArraySeq
ArrayBuffer
Array
- это простой старый массив Java. На сегодняшний день это лучший способ получить доступ к массивам примитивов на низком уровне. Там нет накладных расходов. Кроме того, он может действовать как коллекции Scala благодаря неявному преобразованию в ArrayOps
, которое захватывает базовый массив, применяет соответствующий метод и, при необходимости, возвращает новый массив. Но так как ArrayOps
не специализируется для примитивов, он медленный (такой же медленный, как бокс / распаковка всегда).
WrappedArray
- это простой старый массив Java, но обернутый во все вкусности коллекции Scala. Разница между ним и ArrayOps
заключается в том, что WrappedArray
возвращает еще один WrappedArray
- поэтому, по крайней мере, у вас нет лишних затрат на то, чтобы повторять ArrayOps
ваш примитивный массив Java снова и снова для каждой операции. Полезно использовать, когда вы много взаимодействуете с Java, и вам нужно передавать старые Java-массивы, но на стороне Scala вам нужно удобно ими манипулировать.
ArraySeq
хранит свои данные в простом старом массиве Java, но больше не хранит массивы примитивов; все представляет собой массив объектов. Это означает, что примитивы будут упакованы при входе. Это действительно удобно, если вы хотите использовать примитивы много раз; поскольку у вас хранятся коробочные копии, вам нужно только распаковывать их, а не упаковывать и распаковывать при каждой общей операции.
ArrayBuffer
действует как массив, но вы можете добавлять и удалять элементы из него. Если вы собираетесь пройти весь путь до ArraySeq
, почему бы не добавить дополнительную гибкость в изменении длины, пока вы на нем?