Lo que una comparación horrible! Lo dejo a los demás para explicar cómo llevar a cabo lo que quiere, pero aquí hay un par de razones por las cuales esto no debería ni siquiera ser juzgado:
- de
List
Scala es una colección permanente, inmutable, ArrayList
es una colección mutable ;
- Eso significa
ArrayList
deben copiarse antes de pasados a los métodos que pueden cambiar, si el contenido debe ser preservada, mientras que tal cosa no es necesaria con List
;
- También significa que
ArrayList
operaciones de soporte no son posibles en List
;
List
tiene pre-tiempo constante, ArrayList
ha amortizado el tiempo constante anexar. Ambos tienen tiempo lineal en la otra operación.
ArrayList
tiene acceso indexado en tiempo constante, List
tiene acceso indexado en tiempo lineal, que no es el modo de uso previsto de todos modos;
List
debe usarse a través de métodos de auto-de desplazamiento, tal como foreach
, map
y filter
, que utilizan cierres, ArrayList
está atravesado externamente a través de un iterador o índice.
Por lo tanto, básicamente, cada una de las operaciones eficaces de la otra, y los mismos algoritmos utilizados con uno no se deben utilizar con el otro.Vamos a considerar el punto de referencia que se propone:
crear una lista Scala y añadir decir 100 números aleatorios para que
No añadir elementos a un List
Scala - es inmutable. Crea un nuevo List
basado en un List
existente y un nuevo elemento. Al final, tendrá 100 listas diferentes (de tamaños 1 a 100), todas las cuales se pueden usar sin cambiar la otra. Mientras tanto, si agrega 100 elementos a un ArrayList
, tendrá un ArrayList
de tamaño 100. Por lo tanto, cualquiera que sea la diferencia horaria, cada operación hizo algo diferente.
Editar
les dejo aquí una versión ligeramente diferente del código de naten, que utiliza un método en sí List
a anteponer un elemento, en lugar de llamar a una fábrica.
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;
}
}
Y, en respuesta a su pregunta a él, es como $colon$colon
Scala representa el método ::
en la JVM, que siendo el método utilizado para anteponer elementos. Además, ese método se une a la derecha en lugar de a la izquierda, lo que refleja la naturaleza de la operación, por lo que el comentario es 1::nil
en lugar de nil::1
.
Se hace referencia a la lista vacía, Nil$.MODULE$
, en lugar de crearla de nuevo porque es un singleton; no hay forma de crear una lista vacía.
Supongo que puede escribir un código Scala que use Java ArrayList compilar y ejecutar para comparar ... después de todo, ambos se ejecutarán en JVM. No estoy seguro de si es posible importar la lista de Scala en Java. Pero soy un Scala n00b. Posiblemente mal. – Nishant
El equivalente de Scala de java.util.List es collection.mutable.Buffer. – David
¿Qué tipo de pruebas? ¿Qué escenarios? ¿Qué algoritmos? Las listas de Scala son inmutables por defecto y se supone que deben usarse con patrones de programación funcional. No tiene sentido usarlos de Java. Puedes probar 'ArrayBuffer' que es muy similar a Scala' ArrayList'. – paradigmatic