Como inicializar o objeto List <> em Java?

405

Não consigo inicializar uma lista como no código a seguir:

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

Eu enfrento o seguinte erro:

Não é possível instanciar o tipo List<String>

Como posso instanciar List<String>?

ahmednabil88
fonte

Respostas:

733

Se você marcar a API para Listque você notará que diz:

Interface List<E>

Sendo um interfacemeio, não pode ser instanciado (não new List()é possível).

Se você verificar esse link, encontrará alguns classes que implementam List:

Todas as classes de implementação conhecidas:

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

Aqueles podem ser instanciados. Use os links deles para saber mais sobre eles, IE: para saber o que melhor se adapta às suas necessidades.

Os três mais usados ​​provavelmente são:

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

Bônus:
você também pode instancia-lo com valores, de maneira mais fácil, usando o Arrays classseguinte:

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

Mas observe que você não tem permissão para adicionar mais elementos a essa lista, como está fixed-size.

CADEIA
fonte
11
Arrays.asList é grande, mas como você deve ter notado por agora não consegue fazer o que se espera em casos comoint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D
11
@JAIL Não é isso que está acontecendo. Essa é uma lista de um elemento, onde o único elemento é uma matriz de entradas. O comportamento queria era provavelmente uma lista de três elementos 1, 2 e 3.
Christoffer Hammarström
11
@Christoffer Hammarström para imprimir uma lista ou um array, você poderia usar java.util.Arrays.toString (array) ;, de modo que este recurso já está dado ..
Maxr1998
11
Algum uso de armazenamento de vetores como este e aqui . Devido a problemas de encadeamento
Nuno Rafael Figueiredo
3
Se você precisar que a lista resultante seja uma ArrayList, use #new ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
F Daniel
114

Não é possível instanciar uma interface, mas existem poucas implementações:

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

Além disso, existem muitas outras maneiras fornecidas por outras bibliotecas como o Guava .

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

List é uma interface , você não pode instanciar uma interface, porque interface é uma convenção, quais métodos devem ter suas classes. Para instanciar, você precisa de algumas realizações (implementações) dessa interface. Experimente o código abaixo com implementações muito populares da interface da lista:

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

ou

List<String> supplierNames = new LinkedList<String>();
Doseke
fonte
14

Você precisará usar ArrayList<String>ou algo assim.

List<String> é uma interface.

Usa isto:

import java.util.ArrayList;

...

List<String> supplierNames = new ArrayList<String>();
Ofir Farchy
fonte
13

Lista é uma interface e você não pode inicializar uma interface. Instancie uma classe de implementação.

Gostar:

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

Lista é apenas uma interface, uma definição de alguma lista genérica. Você precisa fornecer uma implementação dessa interface de lista. Dois mais comuns são:

ArrayList - uma lista implementada em uma matriz

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

LinkedList - uma lista implementada como uma cadeia de elementos interconectada

List<String> supplierNames = new LinkedList<String>();
Jakub Zaverka
fonte
9

Na maioria dos casos, você quer simples ArrayList- uma implementação deList

Antes do JDK versão 7

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

JDK 7 e posterior, você pode usar o operador de diamante

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

Informações adicionais estão escritas aqui Documentação Oracle - Coleções

Daniel Perník
fonte
7

Dependendo do tipo de lista que você deseja usar, algo como

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

você deve ir.

Lista é a interface, ArrayList é uma implementação da interface Lista. Mais implementações que podem atender melhor às suas necessidades podem ser encontradas lendo os JavaDocs da interface List .

Uli
fonte
7

Se você quer apenas criar um imutável List<T> com apenas um objeto, pode usar esta API:

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

Mais informações: docs

Sakiboy
fonte
5

Lista é uma interface. Você não pode usar a Lista para inicializá-la.

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

Estas são algumas das classes impelementadas da Lista,

ArrayList, LinkedList, Vector

Você pode usar qualquer um disso conforme sua exigência. Cada uma dessas classes possui seus próprios recursos.

alguém
fonte
Algum uso de armazenamento de vetores como este e aqui . Por causa de problemas de encadeamento
Nuno Rafael Figueiredo
3

Apenas no caso, alguém ainda permanece em torno desta questão. Porque, eu vejo um ou dois novos usuários novamente fazendo a mesma pergunta e todos dizendo: Não , você não pode fazer isso, Caro Prudence . Além de todas as respostas aqui, gostaria de fornecer informações adicionais - Sim, você pode realmente fazer, lista lista = new List (); Mas, ao custo de escrever implementações de todos os métodos de interfaces. A noção não é simplesmente List list = new List (); mas

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;
        }

..... e assim por diante (Não é possível escrever todos os métodos.)

Este é um exemplo de classe anônima . Está correto quando alguém afirma: Não , você não pode instanciar uma interface, e isso mesmo. Mas você nunca pode dizer: Você NÃO pode escrever List list = new List (); mas, evidentemente, você pode fazer isso e é uma afirmação difícil de fazer que você não pode fazer .

kenobiwan
fonte
Para ficar claro, porém, isso não cria um objeto cujo tipo real é List. Em vez disso, declara uma nova classe que não tem nome e implementa e List, em tempo de execução, cria um novo objeto da classe recém-declarada.
Radiodef 16/07/19
0

Criamos soyuz-to para simplificar um problema: como converter Xpara Y(por exemplo, Stringpara Integer). Construindo de um objecto é também uma espécie de conversão por isso, tem uma função simples de construir Map, List, Set:

import io.thedocs.soyuz.to;

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

Verifique - ele tem muitos outros recursos úteis

fedor.belov
fonte