Wie initialisiere ich das List <String> -Objekt in Java?

405

Ich kann eine Liste nicht wie im folgenden Code initialisieren:

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

Ich habe folgenden Fehler:

Der Typ kann nicht instanziiert werden List<String>

Wie kann ich instanziieren List<String>?

ahmednabil88
quelle

Antworten:

733

Wenn Sie den Check - API für ListSie feststellen heißt es:

Interface List<E>

Ein interfaceMittel zu sein, kann nicht instanziiert werden (neinnew List() ist möglich).

Wenn Sie diesen Link überprüfen, finden Sie einige classes, die implementieren List:

Alle bekannten Implementierungsklassen:

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

Diese können instanziiert werden. Verwenden Sie ihre Links, um mehr über sie zu erfahren, IE: um zu wissen, welche besser zu Ihren Anforderungen passt.

Die 3 am häufigsten verwendeten sind wahrscheinlich:

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

Bonus:
Sie können es auch auf einfachere Weise mit Werten instanziieren, indem Sie Arrays classFolgendes verwenden:

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

Beachten Sie jedoch, dass Sie dieser Liste keine weiteren Elemente hinzufügen dürfen fixed-size.

GEFÄNGNIS
quelle
1
Arrays.asList ist großartig, aber wie Sie inzwischen bemerkt haben sollten, kann es in Fällen wieint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D
1
@JAIL Das ist nicht was passiert. Das ist eine Liste eines Elements, wobei das eine Element ein Array von Ints ist. Das gewünschte Verhalten war wahrscheinlich eine Liste von drei Elementen 1, 2 und 3.
Christoffer Hammarström
1
@Christoffer Hammarström, um eine Liste oder ein Array zu drucken, können Sie java.util.Arrays.toString (Array); verwenden, so dass diese Funktion bereits gegeben ist ..
Maxr1998
1
Einige Discorage Verwendung von Vector wie dieser und hier . Wegen Threading-Problemen
Nuno Rafael Figueiredo
3
Wenn Sie die resultierende Liste benötigen ArrayList, verwenden Sienew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F
114

Eine Schnittstelle kann nicht instanziiert werden, es gibt jedoch nur wenige Implementierungen:

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

Außerdem gibt es viele andere Möglichkeiten, die von anderen Bibliotheken wie Guava bereitgestellt werden .

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

Liste ist eine Schnittstelle , Sie können eine Schnittstelle nicht instanziieren, da Schnittstelle eine Konvention ist, welche Methoden Ihre Klassen haben sollten. Zum Instanziieren benötigen Sie einige Realisierungen (Implementierungen) dieser Schnittstelle. Probieren Sie den folgenden Code mit sehr beliebten Implementierungen der List-Schnittstelle aus:

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

oder

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

Sie müssen ArrayList<String>oder so verwenden.

List<String> ist eine Schnittstelle.

Benutze das:

import java.util.ArrayList;

...

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

List ist eine Schnittstelle, und Sie können eine Schnittstelle nicht initialisieren. Instanziieren Sie stattdessen eine implementierende Klasse.

Mögen:

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

Liste ist nur eine Schnittstelle, eine Definition einer generischen Liste. Sie müssen eine Implementierung dieser Listenschnittstelle bereitstellen. Zwei am häufigsten sind:

ArrayList - Eine Liste, die über ein Array implementiert ist

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

LinkedList - eine Liste, die wie eine miteinander verbundene Kette von Elementen implementiert ist

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

In den meisten Fällen möchten Sie einfach ArrayList - eine Implementierung vonList

Vor JDK Version 7

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

JDK 7 und höher können Sie den Diamantoperator verwenden

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

Weitere Informationen finden Sie hier Oracle-Dokumentation - Sammlungen

Daniel Perník
quelle
7

Je nachdem, welche Art von Liste Sie verwenden möchten, so etwas wie

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

sollte dich zum Laufen bringen.

List ist die Schnittstelle, ArrayList ist eine Implementierung der List-Schnittstelle. Weitere Implementierungen, die möglicherweise Ihren Anforderungen besser entsprechen, finden Sie in den JavaDocs der List-Oberfläche .

Uli
quelle
7

Wenn Sie nur eine unveränderliche Datei List<T> mit nur einem Objekt erstellen möchten , können Sie diese API verwenden:

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

Weitere Infos: docs

Sakiboy
quelle
5

Liste ist eine Schnittstelle. Sie können List nicht zum Initialisieren verwenden.

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

Dies sind einige der Klassen mit Listenelementen.

ArrayList, LinkedList, Vector

Sie können dies gemäß Ihren Anforderungen verwenden. Diese Klassen haben jeweils ihre eigenen Funktionen.

jemand
quelle
Einige Discorage Verwendung von Vector wie dieser und hier . Wegen Threading-Problemen
Nuno Rafael Figueiredo
3

Nur für den Fall, dass sich noch jemand mit dieser Frage beschäftigt. Weil ich sehe, dass ein oder zwei neue Benutzer wieder dieselbe Frage stellen und alle dann sagen: Nein, das können Sie nicht, liebe Klugheit . Abgesehen von all den hier gegebenen Antworten möchte ich zusätzliche Informationen bereitstellen - ja, das können Sie tatsächlich do, List list = new List (); Aber auf Kosten des Schreibens Implementierungen aller Methoden von Schnittstellen. Der Begriff ist nicht einfach List list = new List (); aber

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

..... und so weiter (Kann nicht alle Methoden schreiben.)

Dies ist ein Beispiel für eine anonyme Klasse . Es ist richtig, wenn jemand sagt: Nein, Sie können eine Schnittstelle nicht instanziieren, und das ist richtig. Aber Sie können nie sagen, Sie können nicht schreiben List list = new List (); Aber offensichtlich können Sie das tun, und das ist eine schwierige Aussage, die Sie nicht machen können .

Kenobiwan
quelle
Um klar zu sein, wird dadurch kein Objekt erstellt, dessen tatsächlicher Typ ist List. Vielmehr deklariert es eine neue Klasse, die keinen Namen hat und implementiert List, und erstellt zur Laufzeit ein neues Objekt der neu deklarierten Klasse.
Radiodef
0

Wir haben Sojus-To erstellt , um 1 Problem zu vereinfachen: Konvertieren Xin Y(z . B. Stringin Integer). Konstruieren eines Objekts wird auch Art der Umwandlung so ist es eine einfache Funktion zu konstruieren hat Map, List, Set:

import io.thedocs.soyuz.to;

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

Bitte überprüfen Sie es - es hat viele andere nützliche Funktionen

fedor.belov
quelle