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.