objetos - metodos arraylist java




ArrayList inicialización equivalente a la inicialización de matriz (6)

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


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

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.


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.


Que tal este.

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

Arrays.asList puede ayudar aquí:

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

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




arraylist