java clase - ArrayList inicialización equivalente a la inicialización de matriz




metodos como (8)

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.

Esta pregunta ya tiene una respuesta aquí:

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() ?


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:

  1. Primero, los elementos se copian en la Arrays.ArrayList<T> creada por la fábrica estática Arrays.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 como remove(int) pesar de tener una interfaz de lista. Si llama a esos métodos, lanzará una UnspportedMethodException . Pero si todo lo que necesita es una lista de tamaño fijo, puede detenerse aquí.

  2. A continuación, Arrays.ArrayList<T> construido en # 1 se pasa al constructor ArrayList<>(Collection<T>) donde se llama al método collection.toArray() para clonarlo.

    public ArrayList(Collection<? extends E> collection) {
    ......
    Object[] a = collection.toArray();
    }
    
  3. 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.


Arrays.asList("Ryan", "Julie", "Bob");

Arrays.asList puede ayudar aquí:

new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));

Que tal este.

ArrayList<String> names = new ArrayList<String>();
Collections.addAll(names, "Ryan", "Julie", "Bob");

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")

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:

  1. utilizar Groovy o algo así
  2. 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.


Si solo estás agregando una sola variable, entonces push() funciona bien. Si necesita agregar otra matriz, use concat() :

var ar1 = [1, 2, 3];
var ar2 = [4, 5, 6];

var ar3 = ar1.concat(ar2);

alert(ar1);
alert(ar2);
alert(ar3);

Escupirá:

"1,2,3"
"4,5,6"
"1,2,3,4,5,6"

El concat no afecta a ar1 y ar2 menos que sea reasignado, por ejemplo:

ar1 = ar1.concat(ar2);
alert(ar1);

Mostrará:

"1,2,3,4,5,6"

Mucha información here







java arrays initialization arraylist