Jak zrobić nową listę w Javie


762

Tworzymy Setjako:

Set myset = new HashSet()

Jak tworzymy Listw Javie?


1
W javadoc dla listy. „Wszystkie znane klasy implementacyjne: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector”
— KitsuneYMG

121
To pytanie jest jednym z najpopularniejszych haseł w Google dla „listy tworzenia java” i ma bardzo pomocny zestaw odpowiedzi, więc wydaje mi się dość rozsądnym pytaniem :-)
— JosephH

52
To dobre pytanie z dobrymi odpowiedziami. Jednym z celów Stack Overflow jest stworzenie pewnego rodzaju kanonicznej odpowiedzi na pytania programowe, przynajmniej według założycieli strony. Dlatego staraj się unikać głosowania w dół na tego rodzaju posty w przyszłości, jeśli możesz oprzeć się pokusie.
— eggonlegs,

Odpowiedzi:


977
List myList = new ArrayList();

lub z ogólnymi ( Java 7 lub nowszy)

List<MyType> myList = new ArrayList<>();

lub z ogólnymi (starsze wersje Java)

List<MyType> myList = new ArrayList<MyType>();

68
Zauważ, że ArrayList nie jest jedynym rodzajem listy - a jeśli chodzi o pytanie, HashSet nie jest jedynym rodzajem zestawu.
— szczupły

17
Dziwię się, że nikt nie wspomniał, że możesz sprawdzić interfejs listy w dokumentacji Java, aby uzyskać dokładną
— David Mason

5
Jeśli używasz IDE, możesz również ogólnie wyświetlić hierarchię typów, co może być wygodniejsze. W Eclipse domyślnym skrótem jest F4, aw IDEA Ctrl + H.
— David Mason,

1
Z tego, co rozumiem, nie można używać generycznych z ArrayList w C # MSDN
— JohnOsborne

5
Drugi argument typu jawnego <MyType> można zastąpić tylko <> dla Java 7 i 8.
— Jannik

469

Dodatkowo, jeśli chcesz utworzyć listę, która zawiera rzeczy (chociaż będzie miała stały rozmiar):

List<String> messages = Arrays.asList("Hello", "World!", "How", "Are", "You");

15
Zastrzeżenie polega na tym, że tego typu lista (ta zwrócona przez asList ()) jest niezmienna.
— Avrom

70
@Avron - źle: jest tylko ustalony rozmiar: nie możesz zmienić rozmiaru, ale możesz zmienić treść (zastrzeżenie?)
— user85421

Niesamowite. Dziękuję za zwięzłość.
— R Claven,

1
jeśli na liście jest tylko jedna rzecz, używam Collections.singletonList () zamiast Arrays.asList (). (Ale chyba nie wiem dlaczego.)
— MikeB,

@MikeB jeśli nie wiem, dlaczego wtedy trzymać się arrays.aslist
— nahur górski

183

Pozwól, że streszczę i dodam coś:

JDK

1. new ArrayList<String>();
2. Arrays.asList("A", "B", "C")

Guawa

1. Lists.newArrayList("Mike", "John", "Lesly");
2. Lists.asList("A","B", new String [] {"C", "D"});

Niezmienna lista

1. Collections.unmodifiableList(new ArrayList<String>(Arrays.asList("A","B")));
2. ImmutableList.builder()                                      // Guava
            .add("A")
            .add("B").build();
3. ImmutableList.of("A", "B");                                  // Guava
4. ImmutableList.copyOf(Lists.newArrayList("A", "B", "C"));     // Guava

Pusta niezmienna lista

1. Collections.emptyList();
2. Collections.EMPTY_LIST;

Lista znaków

1. Lists.charactersOf("String")                                 // Guava
2. Lists.newArrayList(Splitter.fixedLength(1).split("String"))  // Guava

Lista liczb całkowitych

Ints.asList(1,2,3);                                             // Guava

Ints.asListnie tworzy niezmiennej listy, ale listę o stałym rozmiarze, popartą podaną tablicą liczb całkowitych (tzn. obsługuje List.set(int, Object)). Drugi przykład „niezmiennej listy znaków” również nie jest niezmienny (usunę tę linię).
— Xaerxess

9
Nieużywanie generycznych jest naprawdę „dobrym” przykładem dla każdego programisty, który to przeczyta.
— Natix

60

W Javie 8

Aby utworzyć niepustą listę o stałym rozmiarze (operacje takie jak dodawanie, usuwanie itp. Nie są obsługiwane):

List<Integer> list = Arrays.asList(1, 2); // but, list.set(...) is supported

Aby utworzyć niepustą zmienną listę:

List<Integer> list = new ArrayList<>(Arrays.asList(3, 4));

W Javie 9

Korzystanie z nowych List.of(...)statycznych metod fabrycznych:

List<Integer> immutableList = List.of(1, 2);

List<Integer> mutableList = new ArrayList<>(List.of(3, 4));

W Javie 10

Korzystanie z wnioskowania o typ zmiennej lokalnej :

var list1 = List.of(1, 2);

var list2 = new ArrayList<>(List.of(3, 4));

var list3 = new ArrayList<String>();

I postępuj zgodnie z najlepszymi praktykami ...

Nie używaj surowych typów

Od Java 5 generics są częścią języka - powinieneś ich używać:

List<String> list = new ArrayList<>(); // Good, List of String

List list = new ArrayList(); // Bad, don't do that!

Program do interfejsów

Na przykład program do Listinterfejsu:

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

Zamiast:

ArrayList<Double> list = new ArrayList<>(); // This is a bad idea!

1
Cześć, czy mógłby Pan zasugerować, gdzie mogę poznać te różnice i ewolucję Javy? Wydaje się bardzo interesujące!
— shiv

31

Najpierw przeczytaj to , a potem to i to . 9 razy na 10 skorzystasz z jednej z tych dwóch implementacji.

W rzeczywistości po prostu przeczytaj Przewodnik firmy Sun dotyczący ram kolekcji .


11
Dodałbym nawet „8 razy na 10”, użyjesz ArrayList tylko dlatego, że po prostu nie ma znaczenia 9,9 razy na 10
— Joachim Sauer

1
LinkedList jest semantycznie odpowiedni, gdy naprawdę zależy ci tylko na końcach.
— Adam Jaskiewicz

LinkedLists są doskonałe, jeśli chcesz je powtarzać. Dla mnie wygląda na to, że połączone listy są bardziej eleganckie, ale może dlatego, że nauczyłem się lisp przed Javą.
— KarlP

@Karlp Zgoda. Powiedziałbym, że między ArrayList a LinkedList jest około 50/50, a odpowiedź nie zawsze dotyczy złożoności operacji; częściej jest to po prostu to, co wydaje się odpowiednie dla danego problemu.
— Adam Jaskiewicz

1
Prawie zawsze używałem ArrayList. Jeśli pracuję tylko na końcach listy, jest to deque (lub kolejka) i korzystam z ArrayDequeimplementacji. Powodem jest to, że chociaż implementacje tablicowe mogą marnować trochę pamięci na puste sloty (kiedy nie mogę przewidzieć niezbędnej pojemności), w przypadku małych kolekcji jest to porównywalne do obciążenia wszystkich instancji węzłów na liście połączonej ( lub deque). W zamian dostaję losowy dostęp. Jakie wyjątkowe korzyści LinkedListzapewnia?
— erickson,

21
//simple example creating a list form a string array

String[] myStrings = new String[] {"Elem1","Elem2","Elem3","Elem4","Elem5"};

List mylist = Arrays.asList(myStrings );

//getting an iterator object to browse list items

Iterator itr= mylist.iterator();

System.out.println("Displaying List Elements,");

while(itr.hasNext())

  System.out.println(itr.next());

21

Od wersji Java 7 można wnioskować o typie dla tworzenia instancji ogólnych , więc nie ma potrzeby duplikowania ogólnych parametrów po prawej stronie przypisania:

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

Listę o stałym rozmiarze można zdefiniować jako:

List<String> list = Arrays.asList("foo", "bar");

W przypadku niezmiennych list możesz użyć biblioteki Guava :

List<String> list = ImmutableList.of("foo", "bar");

Mam pytanie dotyczące tej deklaracji List <String> list = Arrays.asList („foo”, „bar”); Zastanawiam się, czy lista w deklaracji jest obiektem?

20

Lista jest tylko interfejsem, tak jak Set .

Podobnie jak HashSet jest implementacją zestawu, który ma pewne właściwości w zakresie dodawania / wyszukiwania / usuwania wydajności, ArrayList jest samą implementacją listy.

Jeśli zajrzysz do dokumentacji odpowiednich interfejsów, znajdziesz „Wszystkie znane klasy implementacyjne” i możesz zdecydować, który jest bardziej odpowiedni dla twoich potrzeb.

Możliwe, że to ArrayList .


18

Listjest interfejsem podobnym Seti ma ArrayListi LinkedListjako implementacje ogólnego przeznaczenia .

Możemy stworzyć Listę jako:

 List<String> arrayList = new ArrayList<>();
 List<String> linkedList = new LinkedList<>(); 

Możemy również utworzyć listę o stałym rozmiarze jako:

List<String> list = Arrays.asList("A", "B", "C");

Prawie zawsze używalibyśmy ArrayListzamiast LinkedListimplementacji:

  1. LinkedList zużywa dużo miejsca na przedmioty i działa źle, gdy mamy dużo elementów.
  2. Każda indeksowana operacja LinkedListwymaga czasu O (n) w porównaniu do O (1) w ArrayList.
  3. Sprawdź ten link, aby uzyskać więcej informacji.

Utworzonej Arrays.asListpowyżej listy nie można modyfikować strukturalnie, ale jej elementy można nadal modyfikować.

Java 8

Zgodnie z dokumentem metoda Collections.unmodifiableListzwraca niemodyfikowalny widok podanej listy. Możemy to uzyskać w następujący sposób:

Collections.unmodifiableList(Arrays.asList("A", "B", "C"));

Java 9

W przypadku korzystania z Java 9 :

List<String> list = List.of("A", "B");

Java 10

Jeśli jesteśmy w Javie 10, metoda Collectors.unmodifiableListzwróci instancję naprawdę niemodyfikowalnej listy wprowadzonej w Javie 9. Sprawdź tę odpowiedź, aby uzyskać więcej informacji na temat różnicy w Collections.unmodifiableList porównaniu Collectors.unmodifiableListz Javą 10 .


9

Czasami - ale bardzo rzadko - zamiast nowej ArrayList, możesz chcieć nowej LinkedList. Zacznij od ArrayList, a jeśli masz problemy z wydajnością i dowody, że lista stanowi problem, i wiele dodawania i usuwania na tej liście - to - nie wcześniej - przełącz się na LinkedList i sprawdź, czy coś się poprawi. Ale w zasadzie trzymaj się ArrayList i wszystko będzie dobrze.


9
List list = new ArrayList();

Lub z lekami generycznymi

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

Możesz oczywiście zastąpić ciąg dowolnym rodzajem zmiennej, np. Integer.


7

Jeden przykład:

List somelist = new ArrayList();

Możesz zajrzeć do javadoc dla List i znaleźć wszystkie znane klasy implementujące Listinterfejs, które są zawarte w java api.


7

Korzystając z kolekcji Google , możesz użyć następujących metod w klasie Listy

import com.google.common.collect.Lists;

// ...

List<String> strings = Lists.newArrayList();

List<Integer> integers = Lists.newLinkedList();

Występują przeciążenia związane z inicjowaniem vararg i inicjowaniem z Iterable<T>.

Zaletą tych metod jest to, że nie trzeba jawnie określać parametru ogólnego, tak jak w przypadku konstruktora - kompilator wywnioskuje go na podstawie typu zmiennej.


6
List<Object> nameOfList = new ArrayList<Object>();

Musisz zaimportować Listi ArrayList.


6

Więcej opcji, aby zrobić to samo z Javą 8, nie lepiej, nie gorzej, po prostu inaczej i jeśli chcesz wykonać dodatkową pracę z listami, strumienie zapewnią ci więcej możliwości (filtrowanie, mapowanie, zmniejszanie itp.)

List<String> listA = Stream.of("a", "B", "C").collect(Collectors.toList());
List<Integer> listB = IntStream.range(10, 20).boxed().collect(Collectors.toList());
List<Double> listC = DoubleStream.generate(() -> { return new Random().nextDouble(); }).limit(10).boxed().collect(Collectors.toList());
LinkedList<Integer> listD = Stream.iterate(0, x -> x++).limit(10).collect(Collectors.toCollection(LinkedList::new));

6

W Javie 9 możesz wykonać następujące czynności, aby stworzyć niezmienny List :

List<Integer> immutableList = List.of(1, 2, 3, 4, 5);

List<Integer> mutableList = new ArrayList<>(immutableList);

6

Opcjonalnie możesz tutaj użyć inicjowania podwójnego nawiasu klamrowego:

List<String> list = new ArrayList<String>(){
  {
   add("a");
   add("b");
  }
};

2
To kosztowna operacja. Tworzysz tutaj anonimową podklasę ArrayList.
— Vikram Bodicherla

@VikramBodicherla Zgadzam się. Bardziej chodzi tu o cukier składniowy.
— angry_gopher


5
List arrList = new ArrayList();

Lepiej jest używać ogólnych, jak sugerowano poniżej:

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

arrList.add("one");

W przypadku korzystania z LinkedList.

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

4

Korzystając z kolekcji Eclipse , możesz utworzyć taką listę:

List<String> list1 = Lists.mutable.empty();
List<String> list2 = Lists.mutable.of("One", "Two", "Three");

Jeśli chcesz niezmienną listę:

ImmutableList<String> list3 = Lists.immutable.empty();
ImmutableList<String> list4 = Lists.immutable.of("One", "Two", "Three");

Możesz uniknąć automatycznego boxowania, używając list prymitywnych. Oto, w jaki sposób tworzysz listy int:

MutableIntList list5 = IntLists.mutable.empty();
MutableIntList list6 = IntLists.mutable.of(1, 2, 3);

ImmutableIntList list7 = IntLists.immutable.empty();
ImmutableIntList list8 = IntLists.immutable.of(1, 2, 3);

Istnieją warianty dla wszystkich 8 prymitywów.

MutableLongList longList       = LongLists.mutable.of(1L, 2L, 3L);
MutableCharList charList       = CharLists.mutable.of('a', 'b', 'c');
MutableShortList shortList     = ShortLists.mutable.of((short) 1, (short) 2, (short) 3);
MutableByteList byteList       = ByteLists.mutable.of((byte) 1, (byte) 2, (byte) 3);
MutableBooleanList booleanList = BooleanLists.mutable.of(true, false);
MutableFloatList floatList     = FloatLists.mutable.of(1.0f, 2.0f, 3.0f);
MutableDoubleList doubleList   = DoubleLists.mutable.of(1.0, 2.0, 3.0);

Uwaga: jestem osobą odpowiedzialną za kolekcje Eclipse.


4

Poniżej przedstawiono niektóre sposoby tworzenia list.

  • Spowoduje to utworzenie listy o ustalonym rozmiarze, dodawanie / usuwanie elementów nie jest możliwe, wyrzuci, java.lang.UnsupportedOperationExceptionjeśli spróbujesz to zrobić.

    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});


  • Poniższa wersja to prosta lista, w której można dodawać / usuwać dowolną liczbę elementów.

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


  • Oto jak utworzyć LinkedListw java. Jeśli chcesz często wstawiać / usuwać elementy z listy, powinieneś użyć LinkedListzamiastArrayList

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

1
Możesz użyć Arrays.asList("Male", "Female").
— Johny

3

Spróbuj tego:

List<String> messages = Arrays.asList("bla1", "bla2", "bla3");

Lub:

List<String> list1 = Lists.mutable.empty(); // Empty
List<String> list2 = Lists.mutable.of("One", "Two", "Three");

2

Jeśli potrzebujesz szeregowej, niezmiennej listy z jednym bytem, ​​możesz użyć:

List<String> singList = Collections.singletonList("stackoverlow");

2

Jak deklaracja listy tablic w java jest jak

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable  

Istnieje wiele sposobów tworzenia i inicjowania listy tablic w Javie.

 1) List list = new ArrayList();

 2) List<type> myList = new ArrayList<>();

 3) List<type> myList = new ArrayList<type>();

 4) Using Utility class

    List<Integer> list = Arrays.asList(8, 4);
    Collections.unmodifiableList(Arrays.asList("a", "b", "c"));

 5) Using static factory method

    List<Integer> immutableList = List.of(1, 2);


 6) Creation and initializing at a time

    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});



 Again you can create different types of list. All has their own characteristics

 List a = new ArrayList();
 List b = new LinkedList();
 List c = new Vector(); 
 List d = new Stack(); 
 List e = new CopyOnWriteArrayList();
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.