¿Cómo inicializar el objeto List <String> en Java?


405

No puedo inicializar una Lista como en el siguiente código:

List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));

Me enfrento al siguiente error:

No se puede crear una instancia del tipo List<String>

¿Cómo puedo instanciar List<String>?

Respuestas:


734

Si marca la API para Listusted notará que dice:

Interface List<E>

Ser un interfacemedio no puede ser instanciado (no new List()es posible).

Si marca ese enlace, encontrará algunos classque implementan List:

Todas las clases de implementación conocidas:

AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack,Vector

Esos pueden ser instanciados. Use sus enlaces para saber más sobre ellos, IE: para saber cuál se adapta mejor a sus necesidades.

Los 3 más utilizados probablemente son:

 List<String> supplierNames1 = new ArrayList<String>();
 List<String> supplierNames2 = new LinkedList<String>();
 List<String> supplierNames3 = new Vector<String>();

Bonificación:
también puede crear instancias con valores, de una manera más fácil, usando el Arrays classsiguiente:

List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));

Pero tenga en cuenta que no puede agregar más elementos a esa lista, ya que es así fixed-size.


1
Arrays.asList es excelente, pero como ya debería haber notado, ahora no hace lo que uno espera en casos comoint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D

1
@JAIL Eso no es lo que está sucediendo. Esa es una lista de un elemento, donde el elemento es una matriz de entradas. El comportamiento deseado era probablemente una lista de tres elementos 1, 2 y 3.
Christoffer Hammarström

1
@Christoffer Hammarström para imprimir una lista o una matriz, puede usar java.util.Arrays.toString (matriz); por lo que esta función ya está disponible ...
Maxr1998

1
Algún uso de descubrimiento de Vector como este y aquí . Por problemas de roscado
Nuno Rafael Figueiredo

3
Si necesita que la lista resultante sea un ArrayList, usenew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

114

No se puede crear una instancia de una interfaz, pero hay pocas implementaciones:

JDK2

List<String> list = Arrays.asList("one", "two", "three");

JDK7

//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");

JDK8

List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());

JDK9

// creates immutable lists, so you can't modify such list 
List<String> immutableList = List.of("one", "two", "three");

// if we want mutable list we can copy content of immutable list 
// to mutable one for instance via copy-constructor (which creates shallow copy)
List<String> mutableList = new ArrayList<>(List.of("one", "two", "three"));

Además, hay muchas otras formas proporcionadas por otras bibliotecas como Guava .

List<String> list = Lists.newArrayList("one", "two", "three");

38

List es una interfaz , no puede crear una instancia de una interfaz, porque la interfaz es una convención, qué métodos deberían tener sus clases. Para crear una instancia, necesita algunas realizaciones (implementaciones) de esa interfaz. Pruebe el siguiente código con implementaciones muy populares de la interfaz List:

List<String> supplierNames = new ArrayList<String>(); 

o

List<String> supplierNames = new LinkedList<String>();

14

Necesitará usar ArrayList<String>o tal.

List<String> es una interfaz

Utilizar este:

import java.util.ArrayList;

...

List<String> supplierNames = new ArrayList<String>();

13

List es una interfaz y no puede inicializar una interfaz. Instanciar una clase de implementación en su lugar.

Me gusta:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();

9

La lista es solo una interfaz, una definición de alguna lista genérica. Debe proporcionar una implementación de esta interfaz de lista. Los dos más comunes son:

ArrayList : una lista implementada sobre una matriz

List<String> supplierNames = new ArrayList<String>();

LinkedList : una lista implementada como una cadena de elementos interconectados

List<String> supplierNames = new LinkedList<String>();

9

En la mayoría de los casos, desea simple ArrayList: una implementación deList

Antes de la versión 7 de JDK

List<String> list = new ArrayList<String>();

JDK 7 y posterior puedes usar el operador de diamante

List<String> list = new ArrayList<>();

Más información está escrita aquí Documentación de Oracle - Colecciones


7

Dependiendo de qué tipo de Lista desea usar, algo como

List<String> supplierNames = new ArrayList<String>();

Debería ponerte en marcha.

List es la interfaz, ArrayList es una implementación de la interfaz List. Puede encontrar más implementaciones que se adapten mejor a sus necesidades leyendo los JavaDocs de la interfaz List .


7

Si solo desea crear un elemento inmutable List<T> con un solo objeto, puede usar esta API:

List<String> oneObjectList = Collections.singletonList("theOnlyObject”);

Más información: docs


5

La lista es una interfaz. No puede usar List para inicializarlo.

  List<String> supplierNames = new ArrayList<String>();

Estas son algunas de las clases de listas impelementadas,

ArrayList, LinkedList, Vector

Puede usar cualquiera de estos según sus requisitos. Estas clases tienen sus propias características.


Algún uso de descubrimiento de Vector como este y aquí . Por problemas de subprocesos
Nuno Rafael Figueiredo

3

Por si acaso, alguien aún se demora en esta pregunta. Porque, veo a uno o dos usuarios nuevos que vuelven a hacer la misma pregunta y todos dicen: `` No , no puedes hacer eso, querida prudencia '' . Además de todas las respuestas dadas aquí, me gustaría proporcionar información adicional. hacer, Lista lista = nueva Lista (); Pero a costa de escribir implementaciones de todos los métodos de Interfaces. La noción no es simplemente List list = new List (); pero

List<Integer> list = new List<Integer>(){

        @Override
        public int size() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean contains(Object o) {
            // TODO Auto-generated method stub
            return false;
        }

..... y así sucesivamente (No puedo escribir todos los métodos).

Este es un ejemplo de clase anónima . Es correcto cuando alguien dice: No , no puede crear una instancia de una interfaz, y eso es correcto. Pero nunca puede decir : NO PUEDE escribir List list = new List (); pero, evidentemente, puedes hacer eso y es una declaración difícil de hacer que no puedes hacer .


Sin embargo, para que quede claro, esto no crea un objeto cuyo tipo real sea List. Más bien, declara una nueva clase que no tiene nombre e implementos List, y en tiempo de ejecución crea un nuevo objeto de la clase recién declarada.
Radiodef

0

Creamos soyuz-to para simplificar 1 problema: cómo convertir Xa Y(por ejemplo, Stringa Integer). La construcción de un objeto es también una especie de conversión por lo que tiene una función simple de construir Map, List, Set:

import io.thedocs.soyuz.to;

List<String> names = to.list("John", "Fedor");

Compruébalo: tiene muchas otras características útiles

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.