Jak zainicjować obiekt List <String> w Javie?


404

Nie mogę zainicjować listy jak w następującym kodzie:

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

Występuje następujący błąd:

Nie można utworzyć wystąpienia typu List<String>

Jak mogę utworzyć instancję List<String>?

Odpowiedzi:


733

Jeśli zaznaczysz API dla Listzauważysz mówi:

Interface List<E>

Będąc interfaceśrodkiem, nie można go utworzyć (nie new List()jest to możliwe).

Jeśli sprawdzisz ten link, znajdziesz kilka classes, które implementują List:

Wszystkie znane klasy wdrożeniowe:

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

Można je utworzyć. Skorzystaj z ich linków, aby dowiedzieć się więcej na ich temat, IE: aby dowiedzieć się, który lepiej pasuje do twoich potrzeb.

3 najczęściej używane to:

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

Premia:
Możesz także utworzyć instancję z wartościami, w łatwiejszy sposób, używając Arrays class:

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

Pamiętaj jednak, że nie możesz dodawać więcej elementów do tej listy, ponieważ jest to fixed-size.


1
Arrays.asList jest świetny, ale jak już zauważyłeś, nie robi tego, czego się spodziewasz w sprawach takich jakint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D

1
@JAIL Tak się nie dzieje. To jest lista jednego elementu, gdzie jeden element jest tablicą liczb całkowitych. Poszukiwanym zachowaniem była prawdopodobnie lista trzech elementów 1, 2 i 3.
Christoffer Hammarström

1
@Christoffer Hammarström, aby wydrukować listę lub tablicę, możesz użyć java.util.Arrays.toString (tablica) ;, więc ta funkcja jest już dostępna ..
Maxr1998

1
Niektóre wykorzystanie Discovery w Vector, tak jak to i tutaj . Z powodu problemów z wątkami
Nuno Rafael Figueiredo,

3
Jeśli potrzebujesz powstałej listy ArrayList, użyjnew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

113

Nie można utworzyć instancji interfejsu, ale istnieje kilka implementacji:

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

Ponadto istnieje wiele innych sposobów dostarczanych przez inne biblioteki, takie jak Guava .

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

38

Lista jest interfejsem , nie można utworzyć instancji interfejsu, ponieważ interfejs jest konwencją, jakie metody powinny mieć twoje klasy. Aby utworzyć instancję, potrzebujesz kilku realizacji (implementacji) tego interfejsu. Wypróbuj poniższy kod z bardzo popularnymi implementacjami interfejsu List:

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

lub

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

14

Będziesz musiał użyć ArrayList<String>lub coś takiego.

List<String> jest interfejsem.

Użyj tego:

import java.util.ArrayList;

...

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

13

Lista jest interfejsem i nie można zainicjować interfejsu. Zamiast tego utwórz instancję klasy implementującej.

Lubić:

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

9

Lista to tylko interfejs, definicja jakiejś ogólnej listy. Musisz podać implementację tego interfejsu listy. Dwa najczęstsze to:

ArrayList - lista zaimplementowana w tablicy

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

LinkedList - lista zaimplementowana jak połączony łańcuch elementów

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

9

W większości przypadków chcesz mieć prostą ArrayListimplementacjęList

Przed wersją 7 JDK

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

JDK 7 i nowsze wersje mogą korzystać z operatora diamentowego

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

Więcej informacji znajduje się tutaj Dokumentacja Oracle - Kolekcje


7

W zależności od rodzaju listy, której chcesz użyć, coś takiego

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

powinienem zacząć.

List to interfejs, ArrayList to jedna implementacja interfejsu List. Więcej implementacji, które mogą lepiej odpowiadać Twoim potrzebom, można znaleźć, czytając JavaDocs interfejsu listy .


7

Jeśli chcesz po prostu stworzyć niezmienny obiekt List<T> z jednym obiektem, możesz użyć tego interfejsu API:

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

Więcej informacji: dokumenty


5

Lista jest interfejsem. Nie można użyć listy do jej zainicjowania.

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

Oto niektóre z klas opartych na Listach,

ArrayList, LinkedList, Vector

Możesz użyć dowolnego z nich zgodnie ze swoimi wymaganiami. Każda z tych klas ma swoje własne cechy.


Niektóre wykorzystanie Discovery w Vector, tak jak to i tutaj . Z powodu problemów z wątkami
Nuno Rafael Figueiredo,

3

Na wszelki wypadek ktoś nadal zastanawia się nad tym pytaniem. Ponieważ widzę, że jeden lub dwóch nowych użytkowników ponownie zadaje to samo pytanie i wszyscy mówią wtedy: Nie, nie możesz tego zrobić, Drogi Ostrożności , Oprócz wszystkich podanych tutaj odpowiedzi, chciałbym podać dodatkowe informacje - Tak, możesz faktycznie do, List list = new List (); Ale kosztem napisania implementacji wszystkich metod interfejsów. Pojęcie to nie jest po prostu List list = new List (); ale

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

..... i tak dalej (nie mogę napisać wszystkich metod.)

To jest przykład klasy Anonimowej . To jest poprawne, gdy ktoś mówi: Nie , nie możesz utworzyć interfejsu, i to prawda. Ale nigdy nie można powiedzieć, że NIE MOŻESZ napisać List list = new List (); ale najwyraźniej możesz to zrobić i trudno powiedzieć, że nie możesz .


Żeby było jasne, nie tworzy to obiektu, którego rzeczywistym typem jest List. Zamiast tego deklaruje nową klasę, która nie ma nazwy i implementujeList , aw czasie wykonywania tworzy nowy obiekt nowo zadeklarowanej klasy.
Radiodef,

0

Stworzyliśmy Sojuz-to uproszczenie 1 problem: jak przekonwertować Xdo Y(na przykład Stringdo Integer). Konstruowanie przedmiotu jest również rodzaj konwersji tak, że ma funkcję prostego skonstruowania Map, List, Set:

import io.thedocs.soyuz.to;

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

Sprawdź to - ma wiele innych przydatnych funkcji

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.