Какое ужасное сравнение! Я оставлю это другим, чтобы объяснить, как выполнить то, что вы хотите, но вот несколько причин, почему это даже не следует пытаться:
- Scala's
List
- это постоянная неизменная коллекция, ArrayList
- изменчивая коллекция;
- Это означает, что
ArrayList
должно быть скопировано перед передачей методам, которые могут его изменить, если содержимое должно быть сохранено, хотя с List
;
- Это также означает, что
ArrayList
операции поддержки невозможны в List
;
List
имеет постоянное время, ArrayList
амортизирует постоянное время. Оба имеют линейное время другой операции.
ArrayList
имеет индексированный доступ с постоянным временем, List
имеет индексированный доступ с линейным временем, который в любом случае не предназначен для использования;
List
следует использовать с помощью методов самообхода, таких как foreach
, map
и filter
, которые используют замыкания, ArrayList
извлекается извне через итератор или индекс.
Так что, по сути, каждый сосет эффективные операции другого, и сами алгоритмы, используемые с одним, не должны использоваться с другим. Давайте рассмотрим тот самый эталон, который вы предлагаете:
создать список Scala и добавить, скажем, 100
случайные числа к нему
Вы не добавляете элементы в Scala List
- он неизменен. Вы создаете новый List
на основе существующего List
и нового элемента. В итоге у вас будет 100 различных списков (размером от 1 до 100), каждый из которых можно использовать, не меняя другой. Между тем, если вы добавите 100 элементов к ArrayList
, у вас будет один ArrayList
размера 100. Таким образом, независимо от разницы во времени, каждая операция делает что-то свое.
Редактировать
Я публикую здесь немного другую версию кода Натена, который использует метод на List
для добавления элемента вместо вызова фабрики.
import scala.collection.immutable.*;
public class Foo {
public List test() {
List nil = Nil$.MODULE$; // the empty list
List one = nil.$colon$colon((Integer) 1); // 1::nil
List two = one.$colon$colon((Integer) 2); // 2::1::nil
System.out.println(one);
System.out.println(two);
return two;
}
}
И, в ответ на ваш вопрос к нему, $colon$colon
- это то, как Scala представляет метод ::
в JVM, который является методом, используемым для добавления элементов. Кроме того, этот метод связывается справа, а не слева, отражая природу операции, поэтому комментарий - 1::nil
вместо nil::1
.
Пустой список, Nil$.MODULE$
, вместо ссылки создается заново, потому что это одиночный файл - создать пустой список невозможно.