Як скласти новий список на Java


762

Ми створюємо Setяк:

Set myset = new HashSet()

Як створити ListJava?


1
На javadoc для Список. "Усі відомі класи втілення: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnWeatherList, Stack, Vector"
KitsuneYMG

121
Це питання є одним з найпопулярніших хітів Google для "списку створення Java", і він має дуже корисний набір відповідей, тому здається мені досить розумним питанням :-)
JosephH

52
Це гарне запитання з хорошими відповідями. Однією з цілей Stack Overflow є створення якоїсь канонічної відповіді на питання програмування, принаймні на думку засновників сайту. Тому, будь ласка, намагайтеся уникнути подальшого голосування таких публікацій, якщо ви зможете протистояти спокусі.
eggonlegs

Відповіді:


977
List myList = new ArrayList();

або за допомогою дженериків ( Java 7 або новіших версій)

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

або з дженериками (стара версія Java)

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

68
Зауважте, що ArrayList - не єдиний вид списку - і, що стосується питання, HashSet - не єдиний вид набору.
струнка

17
Я здивований, що ніхто не згадував, що ви можете шукати інтерфейс списку в документації Java, щоб отримати певний список усіх класів, які реалізують Список: docs.oracle.com/javase/7/docs/api/java/util /List.html
Девід Мейсон

5
Якщо ви використовуєте IDE, ви також можете переглядати там ієрархію типів, що може бути зручніше. У програмі Eclipse ярлик за замовчуванням - F4, а в IDEA - Ctrl + H.
Девід Мейсон

1
З того, що я розумію, ви не можете використовувати дженерики з ArrayList в C # MSDN
JohnOsborne,

5
Другий явний аргумент типу <MyType> можна замінити просто <> для Java 7 та 8.
Jannik

469

Крім того, якщо ви хочете створити список, у якому є речі (хоча він буде фіксованого розміру):

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

15
Застереження полягає в тому, що цей тип списку (той, який повертається asList ()) є незмінним.
Авром

70
@Avron - неправильно: це лише фіксований розмір: ви не можете змінити розмір, але ви можете змінити вміст (застереження про застереження?)
user85421

Дивовижно. Дякую, що ви були лаконічними.
R Клавен

1
якщо в списку є лише одне, я використовую Collections.singletonList () замість Arrays.asList (). (Але, мабуть, я не знаю, чому.)
MikeB

@MikeB, якщо ви не знаєте, чому тоді дотримуватися arrays.aslist
bharal

183

Дозвольте підвести підсумок і додати щось:

JDK

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

Гуава

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

Незмінний список

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

Порожній незмінний список

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

Список персонажів

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

Список цілих чисел

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

Ints.asListне створює незмінний список, але список фіксованого розміру, підкріплений заданим масивом ints (тобто він підтримує List.set(int, Object)). Другий приклад "Змінюваного списку символів" також не змінюється (я б видалив цей рядок).
Xaerxess

9
Якщо не використовувати generics, це справді "хороший" приклад для будь-якого розробника, який прочитає це.
Натікс

60

На Java 8

Щоб створити не порожній список фіксованого розміру (такі операції, як додавання, видалення тощо, не підтримуються):

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

Щоб створити не порожній список змін, виконайте вказані нижче дії.

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

На Java 9

Використання нових List.of(...)статичних заводських методів:

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

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

На Java 10

Використання локальних змінних типів :

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

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

var list3 = new ArrayList<String>();

І дотримуйтесь найкращих практик ...

Не використовуйте сирі типи

Починаючи з Java 5, дженерики є частиною мови - ви повинні їх використовувати:

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

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

Програма для інтерфейсів

Наприклад, програмуйте на Listінтерфейс:

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

Замість:

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

1
Привіт, ви можете підказати, де я можу дізнатися ці відмінності та еволюцію Java? Здається, дуже цікаво!
шив

31

Спочатку прочитайте це , потім прочитайте це і це . 9 разів з 10 ви будете використовувати одну з цих двох реалізацій.

Насправді, просто прочитайте Посібник Соня до рамки колекцій .


11
Я б навіть додав "8 разів з 10" ви будете використовувати ArrayList, тільки тому, що це просто не має значення в 9,9 разів з 10.
Йоахім Зауер

1
LinkedList семантично доречний, коли ви дійсно дбаєте лише про цілі.
Адам Яскевич

LinkedLists чудові, якщо ви просто збираєтесь переглядати їх. Мені здається, ніби зв'язані списки є більш елегантними, але, можливо, це просто тому, що я навчився ляскати перед Java.
KarlP

@Karlp Погодився. Я б сказав, що це майже 50/50 більшості часу між ArrayList та LinkedList, і відповідь не завжди стосується складності операцій; частіше це просто те, що відчуває себе правильним для проблеми.
Адам Яскевич

1
Я майже завжди користувався ArrayList. Якщо я працюю лише з кінцями списку, це deque (або черга), і я використовую ArrayDequeреалізацію. Причина полягає в тому, що навіть незважаючи на те, що реалізація на основі масиву може втратити деяку пам’ять на порожніх слотах (коли я не можу передбачити необхідну ємність), для невеликих колекцій це порівнянно з накладними витратами всіх примірників вузлів у пов'язаному списку ( або деке). А натомість я отримую випадковий доступ. Яку унікальну вигоду LinkedListдає?
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

Оскільки у Java 7 у вас є тип висновку для створення загального примірника , тому немає необхідності дублювати загальні параметри з правого боку завдання:

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

Список фіксованого розміру можна визначити як:

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

Для незмінних списків ви можете використовувати бібліотеку Guava :

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

У мене є питання щодо цього списку декларацій <String> list = Arrays.asList ("foo", "bar"); Цікаво, чи список в декларації є об’єктом?

20

Список - це лише інтерфейс, як і Set .

Як HashSet - це реалізація набору, який має певні властивості щодо додавання / пошуку / видалення продуктивності, ArrayList - це гола реалізація списку.

Якщо ви ознайомитесь з документацією для відповідних інтерфейсів, ви знайдете «Усі відомі класи впровадження» та зможете вирішити, який із них краще підходить для ваших потреб.

Ймовірно, що це ArrayList .


18

Listє інтерфейсом як, так Setі є, ArrayListі LinkedListяк загального призначення .

Ми можемо створити Список так:

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

Ми також можемо створити список фіксованого розміру як:

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

Ми майже завжди використовуємо ArrayListпротилежний до LinkedListвпровадження:

  1. LinkedList використовує багато місця для об’єктів і погано працює, коли у нас багато елементів.
  2. Будь-яка індексована операція LinkedListвимагає часу O (n) порівняно з O (1) дюйма ArrayList.
  3. Перевірте це посилання для отримання додаткової інформації.

Список, створений Arrays.asListвище, не може бути змінений структурно, але його елементи все ще можуть бути змінені.

Java 8

Відповідно до doc , метод Collections.unmodifiableListповертає немодифікований вигляд зазначеного списку. Ми можемо отримати це так:

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

Java 9

Якщо ми використовуємо Java 9, то:

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

Java 10

У випадку, якщо ми перебуваємо на Java 10, то метод Collectors.unmodifiableListповерне екземпляр справді незмінного списку, представленого на Java 9. Перевірте цю відповідь, щоб отримати більше інформації про різницю в Collections.unmodifiableList порівнянні Collectors.unmodifiableListз Java 10 .


9

Іноді - але дуже рідко - замість нового ArrayList вам може знадобитися новий LinkedList. Почніть з ArrayList, і якщо у вас є проблеми з продуктивністю і свідчать про те, що список є проблемою, і багато додавання та видалення до цього списку - тоді - не раніше - перейдіть на LinkedList і подивіться, чи все покращиться. Але в основному, дотримуйтесь ArrayList і все буде добре.


9
List list = new ArrayList();

Або з дженериками

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

Звичайно, ви можете замінити рядок на будь-який тип змінної, наприклад, Integer.


7

Один приклад:

List somelist = new ArrayList();

Ви можете подивитися javadoc для List і знайти всі відомі класи реалізації Listінтерфейсу, що входять до програми java api.


7

Використовуючи колекції Google , ви можете використовувати наступні методи у класі Списки

import com.google.common.collect.Lists;

// ...

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

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

Існують перевантаження для ініціалізації varargs та ініціалізації з Iterable<T> .

Перевага цих методів полягає в тому, що вам не потрібно чітко вказувати загальний параметр так, як це було б із конструктором - компілятор виводить його з типу змінної.


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

Вам потрібно імпортувати Listі ArrayList.


6

Більше варіантів зробити те ж саме з Java 8, не краще, не гірше, просто інше, і якщо ви хочете зробити додаткову роботу зі списками, Streams надасть вам більше альтернатив (фільтрувати, картографувати, зменшувати тощо)

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

З Java 9 ви можете зробити наступне, щоб створити незмінний List :

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

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

6

Тут ви можете використовувати подвійну дужку ініціалізації:

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

2
Це дорога операція. Ви створюєте тут анонімний підклас ArrayList.
Vikram Bodicherla

@VikramBodicherla Я згоден. Тут ідеться більше про синтаксичний цукор.
golden_gopher

5

Існує багато способів створення набору та списку. HashSet і ArrayList - лише два приклади. Також досить часто в даний час використовувати дженерики з колекціями. Я пропоную вам поглянути на те, що вони є

Це хороший вступ для вбудованих колекцій Java. http://java.sun.com/javase/6/docs/technotes/guides/collections/overview.html


5
List arrList = new ArrayList();

Краще використовувати дженерики, як запропоновано нижче:

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

arrList.add("one");

Якщо ви використовуєте LinkedList.

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

4

Використовуючи колекції Eclipse, ви можете створити такий список:

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

Якщо ви хочете незмінний список:

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

Ви можете уникнути автоматичного боксу, використовуючи примітивні списки. Ось як можна створити списки 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);

Є варіанти для всіх 8 примітивів.

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

Примітка. Я є членом колекції Eclipse.


4

Нижче наведено кілька способів створення списків.

  • Це створить список із фіксованим розміром, додавання / видалення елементів неможливо, воно буде викинуто, java.lang.UnsupportedOperationExceptionякщо ви спробуєте це зробити.

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


  • Наступна версія - це простий список, де можна додати / видалити будь-яку кількість елементів.

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


  • Ось як створити LinkedListjava. Якщо вам потрібно робити часті вставки / видалення елементів у списку, слід використовувати LinkedListзамістьArrayList

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

1
Можна використовувати Arrays.asList("Male", "Female").
Джонні

3

Спробуйте це:

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

Або:

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

2

Якщо вам потрібен серіалізаційний, незмінний список з однією сутністю, ви можете використовувати:

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

2

Як оголошення списку масивів у java подібне

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

Існує численні способи створення та ініціалізації списку масивів у Java.

 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.