Как инициализировать объект List <String> в Java?

405

Я не могу инициализировать список, как в следующем коде:

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

Я сталкиваюсь со следующей ошибкой:

Не удается создать экземпляр типа List<String>

Как я могу создать экземпляр List<String>?

ahmednabil88
источник

Ответы:

734

Если проверить API для Listвы заметите , что говорит:

Interface List<E>

Будучи interfaceсредством, оно не может быть реализовано (нет new List()возможности).

Если вы проверите эту ссылку, вы найдете некоторые из них, classкоторые реализуют List:

Все известные классы реализации:

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

Те могут быть созданы. Используйте их ссылки, чтобы узнать о них больше, IE: чтобы узнать, что соответствует вашим потребностям.

3 наиболее часто используемых из них:

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

Бонус:
Вы можете также создать его со значениями, более простым способом, используя Arrays classследующее:

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

Но обратите внимание, что вы не можете добавлять больше элементов в этот список, так как это fixed-size.

JAIL
источник
1
Arrays.asList великолепен, но, как вы уже могли заметить, не может сделать то, что ожидается в таких случаях, какint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D
1
@ JAIL Это не то, что происходит. Это список одного элемента, где один элемент представляет собой массив целых. Разыскиваемое поведение было, вероятно, списком из трех элементов 1, 2 и 3.
Кристоффер Хаммарстрем
1
@Christoffer Hammarström, чтобы напечатать список или массив, вы можете использовать java.util.Arrays.toString (array) ;, так что эта функция уже предоставлена ​​..
Maxr1998
1
Некоторое нежелание использовать Vector, как это и здесь . Из-за проблем с потоками
Нуно Рафаэль Фигейредо
3
Если вам нужен результирующий список ArrayList, используйтеnew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F
115

Не могу создать интерфейс, но есть несколько реализаций:

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

Кроме того, есть множество других способов, предоставляемых другими библиотеками, такими как Guava .

List<String> list = Lists.newArrayList("one", "two", "three");
LazerBanana
источник
38

Список - это интерфейс , вы не можете создать экземпляр интерфейса, потому что интерфейс - это соглашение о том, какие методы должны иметь ваши классы. Чтобы создать экземпляр, вам нужны некоторые реализации (реализации) этого интерфейса. Попробуйте приведенный ниже код с очень популярными реализациями интерфейса List:

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

или

List<String> supplierNames = new LinkedList<String>();
Doseke
источник
14

Вам нужно будет использовать ArrayList<String>или такой.

List<String> это интерфейс.

Использовать этот:

import java.util.ArrayList;

...

List<String> supplierNames = new ArrayList<String>();
Офир Фарчи
источник
13

Список - это интерфейс, и вы не можете инициализировать интерфейс. Вместо этого создайте класс реализации.

Подобно:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();
Анкит
источник
9

Список - это просто интерфейс, определение некоторого общего списка. Вы должны предоставить реализацию этого интерфейса списка. Два наиболее распространенных являются:

ArrayList - список, реализованный через массив

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

LinkedList - список, реализованный в виде взаимосвязанной цепочки элементов

List<String> supplierNames = new LinkedList<String>();
Якуб Заверка
источник
9

В большинстве случаев вы хотите просто ArrayList- реализацияList

До версии 7 JDK

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

JDK 7 и позже вы можете использовать алмазный оператор

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

Дополнительная информация написана здесь Oracle документации - Коллекции

Даниэль Перник
источник
7

В зависимости от того, какой список вы хотите использовать, что-то вроде

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

должен заставить вас идти.

List - это интерфейс, ArrayList - это одна из реализаций интерфейса List. Больше реализаций, которые могут лучше удовлетворить ваши потребности, можно найти, прочитав JavaDocs интерфейса List .

Uli
источник
7

Если вы просто хотите создать неизменяемый объект List<T>только с одним объектом, вы можете использовать этот API:

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

Больше информации: документы

Sakiboy
источник
5

Список - это интерфейс. Вы не можете использовать List для его инициализации.

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

Это некоторые из реализованных классов List,

ArrayList, LinkedList, Vector

Вы можете использовать любое из этого согласно вашему требованию. У каждого из этих классов есть свои особенности.

кто то
источник
Некоторое нежелание использовать Vector, как это и здесь . Из-за проблем с потоками
Нуно Рафаэль Фигейредо
3

На всякий случай, кто-нибудь еще задержится вокруг этого вопроса. Потому что я вижу одного или двух новых пользователей, снова задающих тот же вопрос, и все тогда говорят: « Нет, вы не можете этого сделать, дорогая Пруденс. Помимо всех ответов, приведенных здесь, я хотел бы предоставить дополнительную информацию - Да, вы действительно можете do, List list = new List (); Но за счет написания реализаций всех методов интерфейсов. Это не просто список список = новый список (); но

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

..... и так далее (не могу написать все методы.)

Это пример класса Anonymous . Это правильно, когда кто-то заявляет: нет, вы не можете создать экземпляр интерфейса, и это правильно. Но вы никогда не можете сказать, что вы НЕ МОЖЕТЕ написать List list = new List (); но, очевидно, вы можете сделать это, и это сложное утверждение, которое вы не можете сделать .

kenobiwan
источник
Чтобы было ясно, хотя, это не создает объект, фактический тип которого List. Скорее, он объявляет новый класс, который не имеет имени и реализует List, и во время выполнения создает новый объект вновь объявленного класса.
Radiodef
0

Мы создали союз-to, чтобы упростить 1 задачу: как конвертировать Xв Y(например, Stringв Integer). Построение объекта также вид преобразования поэтому она имеет простую функцию для построения Map, List, Set:

import io.thedocs.soyuz.to;

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

Пожалуйста, проверьте это - у него много других полезных функций

fedor.belov
источник