Co za straszne porównanie! Zostawię go innym, aby wyjaśnić, jak osiągnąć to, co chcesz, ale tutaj jest kilka powodów, dla których nie powinno być nawet próbowałem:
- Scala
List
jest trwały, niezmienny zbiór, ArrayList
jest zmienny zbiór ;
- Oznacza to
ArrayList
musi zostać skopiowany zanim przeszedł do metod, które mogą ją zmienić, jeśli zawartość musi zostać zachowany, a nie coś takiego jest konieczne ze List
;
- Oznacza to również, że operacje wspierające nie są możliwe w
List
;
List
ma ciągły czas wstępny, ArrayList
zamortyzował ciągłe dołączenie. Oba mają czas liniowy w drugiej operacji.
ArrayList
ma dostęp indeksowany o stałym czasie, List
ma indeksowany czas dostępu liniowego, co i tak nie jest zamierzonym sposobem użycia;
List
należy stosować metodami siebie przesuwu, jak foreach
, map
i filter
, które wykorzystują zamknięcia ArrayList
jest zewnętrznie przepływa przez iteracyjnej lub indeks.
Zasadniczo, każdy zasysa efektywne operacje drugiego, a same algorytmy nie powinny być używane z innymi.Rozważmy bardzo benchmarku proponujecie:
tworzenia listy scala i dodać powiedzieć 100 liczb losowych do niego
Nie dodawać elementy do Scala List
- jest niezmienna. Tworzysz nowy List
w oparciu o istniejący List
i nowy element. W końcu będziesz mieć 100 różnych list (o wielkości od 1 do 100), z których wszystkie mogą być używane bez zmiany drugiego. Tymczasem, jeśli dodasz 100 elementów do ArrayList
, będziesz miał jeden ArrayList
o rozmiarze 100. Tak więc, niezależnie od różnic czasu, każda operacja zrobiła coś innego.
Edit
jestem delegowania tutaj nieco inną wersję kodu naten, która wykorzystuje metodę na samym List
do poprzedzić element, zamiast dzwonić do fabryki.
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;
}
}
A w odpowiedzi na pytanie do niego, $colon$colon
sposób Scala reprezentuje metodę ::
w JVM, który jest metoda stosowana do poprzedzić elementy. Ponadto ta metoda jest wiązana w prawo zamiast w lewo, odzwierciedlając charakter operacji, dlatego komentarz jest 1::nil
zamiast nil::1
.
Pusta lista, Nil$.MODULE$
, jest przywoływana zamiast tworzona od nowa, ponieważ jest to singleton - nie ma możliwości utworzenia pustej listy.
Zgaduję, że możesz napisać kod Scala, który używa kompilacji Java ArrayList i wykonać, aby porównać ... po-wszystkie obie będą działać na JVM. Nie jestem pewien, czy możliwe jest zaimportowanie listy Scala w Javie. Ale ja jestem Scala n00b. Prawdopodobnie źle. – Nishant
Scala odpowiednik java.util.List to collection.mutable.Buffer. – David
Jakie testy? Jakie scenariusze? Jakie algorytmy? Listy Scala są domyślnie niezmienne i powinny być używane z funkcjonalnymi wzorami programowania. Nie ma sensu używać ich z Javy. Możesz wypróbować 'ArrayBuffer', który jest bardzo podobny do Scala' ArrayList'. – paradigmatic