objetos metodos llenar imprimir enteros como clase java arrays initialization arraylist

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í:

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:

  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.


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


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