Как сделать новый список в Java

599

Создаем Set как:

Set myset = new HashSet()

Как мы создаем List в Java?

  • 1
    На Javadoc для списка. «Все известные классы реализации: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector»
  • 115
    Этот вопрос является одним из самых популярных в Google по списку «java create list», и у него очень полезный набор ответов, поэтому он кажется мне достаточно разумным :-)
Показать ещё 1 комментарий
Теги:
list
collections

24 ответа

873
Лучший ответ
List myList = new ArrayList();

или с дженериками (Java 7 или более поздняя версия)

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

или с дженериками (старые версии Java)

List<MyType> myList = new ArrayList<MyType>();
  • 64
    Обратите внимание, что ArrayList - не единственный вид List - и, что касается вопроса, HashSet - не единственный вид Set.
  • 15
    Я удивлен, что никто не упомянул, что вы можете посмотреть интерфейс списка в документации Java, чтобы получить определенный список всех классов, которые реализуют List: docs.oracle.com/javase/7/docs/api/java/util /List.html
Показать ещё 5 комментариев
392

Кроме того, если вы хотите создать список, в котором есть вещи (хотя это будет фиксированный размер):

List<String> messages = Arrays.asList("Hello", "World!", "How", "Are", "You");
  • 12
    Предостережение заключается в том, что этот тип списка (тот, который возвращается asList ()) является неизменным.
  • 61
    @Avron - неправильно: это только фиксированный размер: вы не можете изменить размер, но вы можете изменить содержимое (предостережение о предостережении?)
Показать ещё 2 комментария
161

Позвольте мне подытожить и добавить что-то:

JDK

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

Guava

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
  • 0
    Ints.asList создает не неизменяемый список, а список фиксированного размера с заданным массивом целых чисел (т.е. он поддерживает List.set(int, Object) ). Второй пример «Неизменяемого списка символов» также не является неизменным (я бы удалил эту строку).
  • 7
    Неиспользование дженериков создает действительно «хороший» пример для любого разработчика, который прочтет это.
31

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

На самом деле просто прочитайте Руководство Sun для структуры коллекций.

  • 10
    Я бы даже добавил «8 раз из 10», вы будете использовать ArrayList, просто потому, что это просто не имеет значения в 9,9 раз из 10.
  • 1
    LinkedList семантически уместен, когда вы действительно заботитесь только о концах.
Показать ещё 3 комментария
21

Начиная с Java 7 у вас введите вывод для создания общего экземпляра, поэтому нет необходимости дублировать общие параметры в правой части назначение:

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

Список фиксированного размера можно определить как:

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

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

List<String> list = ImmutableList.of("foo", "bar");
  • 0
    У меня есть вопрос относительно этого объявления. List <String> list = Arrays.asList ("foo", "bar"); Мне интересно, является ли список в объявлении объектом?
21

List - это просто интерфейс, как Set.

Подобно HashSet - это реализация Set, которая обладает определенными свойствами в отношении добавления/поиска/удаления производительности, ArrayList является простой реализацией списка.

Если вы посмотрите на документацию для соответствующих интерфейсов, вы найдете "Все известные классы внедрения", и вы можете решить, какой из них больше подходит для ваших нужд.

Скорее всего, он ArrayList.

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

В 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!
14

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

Согласно документу, метод 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
List list = new ArrayList();

Или с помощью дженериков

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

Вы можете, конечно, заменить строку любым типом переменной, например Integer.

8

Иногда - но только очень редко - вместо нового ArrayList вам может понадобиться новый LinkedList. Начните с ArrayList, и если у вас проблемы с производительностью и доказательства того, что список является проблемой, а также много добавления и удаления в этот список, то - не раньше - переключитесь на LinkedList и посмотрите, улучшатся ли ситуации. Но в основном придерживайтесь ArrayList, и все будет хорошо.

7

Используя Коллекции Google, вы можете использовать следующие методы в Lists класс

import com.google.common.collect.Lists;

// ...

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

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

Существуют перегрузки для инициализации и инициализации varargs из Iterable<T>.

Преимущество этих методов заключается в том, что вам не нужно явно указывать общий параметр, как это было бы с конструктором - компилятор выведет его из типа переменной.

7

Один пример:

List somelist = new ArrayList();

Вы можете посмотреть javadoc для списка и найти все известные классы реализации интерфейса List, которые включены в java api.

6

С помощью Java 9 вы можете сделать следующее, чтобы создать неизменяемый List:

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

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

Вам нужно импортировать List и ArrayList.

5

Больше возможностей сделать то же самое с 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));
5
List arrList = new ArrayList();

Чем лучше вы используете дженерики, как предлагается ниже:

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

arrList.add("one");

Если вы используете LinkedList.

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

В качестве опции вы можете использовать инициализацию двойной привязки:

List<String> list = new ArrayList<String>(){{
add("a");
add("b");
}};
  • 2
    Это дорогая операция. Вы создаете анонимный подкласс ArrayList здесь.
  • 0
    @VikramBodicherla Я согласен. Это больше о синтаксисе сахара здесь.
5

Есть много способов создать набор и список. HashSet и ArrayList - это только два примера. В наши дни также довольно распространено использование генериков с коллекциями. Я предлагаю вам взглянуть на то, что они

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

4

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

  • Это создаст список с фиксированным размером, добавление/удаление элементов невозможно, при попытке сделать это выкинет java.lang.UnsupportedOperationException.

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


  • Следующая версия представляет собой простой список, в котором вы можете добавить/удалить любое количество элементов.

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


  • Вот как создать LinkedList в java. Если вам нужно часто вставлять/удалять элементы в списке, вы должны использовать LinkedList вместо ArrayList

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

4

Используя Eclipse Collections, вы можете создать список, подобный этому:

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.

2

Если вам нужен сериализуемый, неизменяемый список с одной сущностью, которую вы можете использовать:

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

Попробуй это:

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

Или же:

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

Экземпляр List может быть создан любым из следующих способов:

    List list1 = new ArrayList();
    List list2 = new Stack();
    List list3 = new LinkedList();
    List list4 = new Vector();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню