Come inizializzare l'oggetto List <String> in Java?


405

Non riesco a inizializzare un Elenco come nel seguente codice:

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

Ho riscontrato il seguente errore:

Impossibile creare un'istanza del tipo List<String>

Come posso creare un'istanza List<String>?

Risposte:


734

Se controlli l' API per Listnoterai che dice:

Interface List<E>

Essere un interfacemezzo non può essere istanziato (no new List()è possibile).

Se controlli quel link, troverai alcuni classes che implementano List:

Tutte le classi di esecuzione conosciute:

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

Quelli possono essere istanziati. Usa i loro link per saperne di più, IE: per sapere quale si adatta meglio alle tue esigenze.

I 3 più usati probabilmente sono:

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

Bonus:
puoi anche istanziarlo con valori, in un modo più semplice, usando il Arrays class, come segue:

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

Ma tieni presente che non puoi aggiungere altri elementi a tale elenco, in quanto è fixed-size.


1
Arrays.asList è eccezionale, ma come avresti dovuto notare ormai non riesce a fare ciò che ci si aspetta in casi comeint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D

1
@JAIL Non è quello che sta succedendo. Questo è un elenco di un elemento, in cui l'elemento è una matrice di ints. Il comportamento desiderato era probabilmente un elenco di tre elementi 1, 2 e 3.
Christoffer Hammarström,

1
@Christoffer Hammarström per stampare un elenco o un array, potresti usare java.util.Arrays.toString (array) ;, quindi questa funzione è già stata fornita ..
Maxr1998,

1
Alcuni discorage usano Vector come questo e qui . A causa di problemi di threading
Nuno Rafael Figueiredo,

3
Se hai bisogno che l'elenco risultante sia un ArrayList, usanew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

114

Impossibile creare un'istanza di un'interfaccia ma ci sono alcune implementazioni:

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

Inoltre ci sono molti altri modi forniti da altre librerie come Guava .

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

38

List è un'interfaccia , non è possibile istanziare un interfaccia, perché l'interfaccia è una convenzione, quali metodi devono avere le classi. Per creare un'istanza, sono necessarie alcune realizzazioni (implementazioni) di tale interfaccia. Prova il codice seguente con implementazioni molto popolari dell'interfaccia Elenco:

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

o

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

14

Dovrai usare ArrayList<String>o simili.

List<String> è un'interfaccia.

Usa questo:

import java.util.ArrayList;

...

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

13

L'elenco è un'interfaccia e non è possibile inizializzare un'interfaccia. Istanziare invece una classe di implementazione.

Piace:

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

9

Elenco è solo un'interfaccia, una definizione di un elenco generico. È necessario fornire un'implementazione di questa interfaccia di elenco. Due più comuni sono:

ArrayList : un elenco implementato su un array

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

LinkedList : un elenco implementato come una catena di elementi interconnessi

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

9

Nella maggior parte dei casi si desidera semplice ArrayList: un'implementazione diList

Prima della versione 7 di JDK

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

JDK 7 e versioni successive è possibile utilizzare l'operatore diamante

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

Ulteriori informazioni sono scritte qui Documentazione Oracle - Collezioni


7

A seconda del tipo di elenco che si desidera utilizzare, qualcosa del genere

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

dovrebbe farti andare.

List è l'interfaccia, ArrayList è un'implementazione dell'interfaccia List. Altre implementazioni che potrebbero soddisfare meglio le tue esigenze possono essere trovate leggendo i JavaDocs dell'interfaccia Elenco .


7

Se vuoi solo creare un immutabile List<T> con un solo oggetto, puoi usare questa API:

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

Ulteriori informazioni: documenti


5

L'elenco è un'interfaccia. Non è possibile utilizzare Elenco per inizializzarlo.

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

Queste sono alcune delle classi impelementate dell'elenco,

ArrayList, LinkedList, Vector

Puoi usare tutto questo secondo le tue esigenze. Queste classi hanno le loro caratteristiche.


Alcuni discorage usano Vector come questo e qui . A causa di problemi di threading
Nuno Rafael Figueiredo,

3

Per ogni evenienza, qualcuno si sofferma ancora su questa domanda. Perché, vedo ancora uno o due nuovi utenti che fanno la stessa domanda e tutti poi dicono, No , non puoi farlo, Cara Prudence , a parte tutte le risposte fornite qui, vorrei fornire Informazioni aggiuntive - Sì, puoi effettivamente fare, Elenco elenco = nuovo Elenco (); Ma a costo di scrivere implementazioni di tutti i metodi delle interfacce. Il concetto non è semplicemente List list = new List (); ma

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 così via (non posso scrivere tutti i metodi.)

Questo è un esempio di classe anonima . È corretto quando qualcuno afferma, No , non puoi istanziare un'interfaccia, ed è giusto. Ma non puoi mai dire, CANT scrivi List list = new List (); ma, evidentemente, puoi farlo ed è un'affermazione difficile affermare che non puoi farlo .


Per essere chiari, tuttavia, questo non crea un oggetto il cui tipo reale è List. Piuttosto, dichiara una nuova classe che non ha nome e implementa List, e in fase di esecuzione crea un nuovo oggetto della classe appena dichiarata.
Radiodef,

0

Abbiamo creato Soyuz-a semplificare 1 problema: come convertire Xa Y(ad esempio Stringa Integer). Costruzione di un oggetto è anche tipo di conversione quindi ha una semplice funzione di costruire Map, List, Set:

import io.thedocs.soyuz.to;

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

Si prega di controllare - ha molte altre utili funzioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.