java - metodos - ArrayList inicialización equivalente a la inicialización de matriz
imprimir arraylist java (8)
Aquí está lo más cerca que puedes conseguir:
ArrayList<String> list = new ArrayList(Arrays.asList("Ryan", "Julie", "Bob"));
Puedes ir incluso más simple con:
List<String> list = Arrays.asList("Ryan", "Julie", "Bob")
Mirando la fuente de Arrays.asList, construye una ArrayList, pero por defecto se convierte a la Lista. Así que puedes hacer esto (pero no de forma confiable para nuevos JDK):
ArrayList<String> list = (ArrayList<String>)Arrays.asList("Ryan", "Julie", "Bob")
Esta pregunta ya tiene una respuesta aquí:
- Crear ArrayList desde matriz 34 respuestas
- Inicialización de un ArrayList en una línea 30 respuestas
Soy consciente de que puede inicializar una matriz durante la creación de instancias de la siguiente manera:
String[] names = new String[] {"Ryan", "Julie", "Bob"};
¿Hay una manera de hacer lo mismo con un ArrayList? ¿O debo agregar los contenidos individualmente con array.add()
?
Así es como se hace usando la interfaz fluida de la biblioteca Java op4j (1.1. Fue lanzado en diciembre de 2010): -
List<String> names = Op.onListFor("Ryan", "Julie", "Bob").get();
Es una biblioteca muy interesante que te ahorra un montón de tiempo.
Bueno, en Java no hay una sintaxis literal para las listas, así que tienes que hacer .add ().
Si tiene muchos elementos, es un poco detallado, pero podría:
- utilizar Groovy o algo así
- usar Arrays.asList (array)
2 se vería algo así como:
String[] elements = new String[] {"Ryan", "Julie", "Bob"};
List list = new ArrayList(Arrays.asList(elements));
Esto resulta en una creación de objeto innecesario sin embargo.
La respuesta seleccionada es: ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));
Sin embargo, es importante comprender la respuesta seleccionada, copia internamente los elementos varias veces antes de crear la matriz final y que existe una forma de reducir parte de esa redundancia.
Comencemos por entender lo que está pasando:
Primero, los elementos se copian en la
Arrays.ArrayList<T>
creada por la fábrica estáticaArrays.asList(T...)
.Esto no produce la misma clase que
java.lang.ArrayList
pesar de tener el mismo nombre de clase simple. No implementa métodos comoremove(int)
pesar de tener una interfaz de lista. Si llama a esos métodos, lanzará unaUnspportedMethodException
. Pero si todo lo que necesita es una lista de tamaño fijo, puede detenerse aquí.A continuación,
Arrays.ArrayList<T>
construido en # 1 se pasa al constructorArrayList<>(Collection<T>)
donde se llama al métodocollection.toArray()
para clonarlo.public ArrayList(Collection<? extends E> collection) { ...... Object[] a = collection.toArray(); }
A continuación, el constructor decide si adopta la matriz clonada o si la copia nuevamente para eliminar el tipo de subclase. Dado que
Arrays.asList(T...)
utiliza internamente una matriz de tipo T, la misma que pasamos como parámetro, el constructor siempre rechaza el uso del clon a menos que T sea un Objeto puro. (Ej. Cadena, Entero, etc., todos se copian de nuevo, porque extienden el Objeto).if (a.getClass() != Object[].class) { //Arrays.asList(T...) is always true here //when T subclasses object Object[] newArray = new Object[a.length]; System.arraycopy(a, 0, newArray, 0, a.length); a = newArray; } array = a; size = a.length;
Por lo tanto, nuestros datos se copiaron 3 veces solo para inicializar explícitamente el ArrayList. Podríamos Arrays.AsList(T...)
a 2x si Arrays.AsList(T...)
a construir una matriz Object [], para que ArrayList pueda adoptarla posteriormente, lo que se puede hacer de la siguiente manera:
(List<Integer>)(List<?>) new ArrayList<>(Arrays.asList((Object) 1, 2 ,3, 4, 5));
O tal vez simplemente agregar los elementos después de la creación podría ser el más eficiente.
Que tal este.
ArrayList<String> names = new ArrayList<String>();
Collections.addAll(names, "Ryan", "Julie", "Bob");
Sí.
new ArrayList<String>(){{
add("A");
add("B");
}}
Lo que realmente está haciendo es crear una clase derivada de ArrayList<String>
(el conjunto exterior de llaves hace esto) y luego declarar un inicializador estático (el conjunto interno de llaves). Esta es en realidad una clase interna de la clase contenedora, por lo que tendrá un puntero implícito. No es un problema a menos que desee serializarlo, o está esperando que la clase externa se recoja.
Entiendo que Java 7 proporcionará construcciones de lenguaje adicionales para hacer precisamente lo que desea.
EDITAR: las versiones recientes de Java proporcionan más funciones utilizables para crear tales colecciones, y vale la pena investigar sobre lo anterior (proporcionado en un momento anterior a estas versiones)
Arrays.asList puede ayudar aquí:
new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));
Arrays.asList("Ryan", "Julie", "Bob");