Як ініціалізувати об’єкт 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>?

Відповіді:


733

Якщо поштова 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.


1
Arrays.asList - це чудово, але, як ви повинні зауважити, не вдається зробити те, що очікується у таких випадкахint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D

1
@JAIL Це не те, що відбувається. Це список одного елемента, де один елемент є масивом ints. Шукана поведінка, ймовірно, була переліком трьох елементів 1, 2 і 3.
Крістоффер Хаммарстрем

1
@Christoffer Hammarström для друку списку чи масиву, ви можете використовувати java.util.Arrays.toString (масив);, тому ця функція вже надана ..
Maxr1998

1
Деякі сповіщення використання вектора, як цей, і тут . Через проблеми з ниткою
Nuno Rafael Figueiredo

3
Якщо вам потрібен список ArrayList, використовуйтеnew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

114

Неможливо створити інтерфейс, але є кілька реалізацій:

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

38

Список - це інтерфейс , ви не можете інстанціювати інтерфейс, оскільки інтерфейс є умовою, якими методами повинні володіти ваші класи. Для того, щоб створити інстанцію, вам потрібні деякі реалізації (реалізації) цього інтерфейсу. Спробуйте наведений нижче код з дуже популярними реалізаціями інтерфейсу List:

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

або

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

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

До JDK версії 7

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

JDK 7 і пізніші версії можна використовувати оператор алмазів

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

Додаткові відомості написані тут. Документація Oracle - Колекції


7

Залежно від типу списку, який ви хочете використовувати, щось подібне

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

повинні змусити вас йти.

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


7

Якщо ви просто хочете створити в ньому незмінний List<T> лише один об'єкт, ви можете скористатися цим API:

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

Більше інформації: док


5

Список - інтерфейс. Ви не можете використовувати Список для ініціалізації.

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

Ось деякі класи, що перебувають у списку,

ArrayList, LinkedList, Vector

Ви можете використовувати будь-що з цього, відповідно до вашої вимоги. У кожного кожного класу є свої особливості.


Деякі сповіщення використання вектора, як цей, і тут . Через проблеми з ниткою
Nuno Rafael Figueiredo

3

Про всяк випадок, хтось все ще затримується навколо цього питання. Тому що я бачу одного або двох нових користувачів знову, що задають те саме питання, і всі потім говорять: Ні, ви не можете цього зробити, Шановна розсудливість , окрім усіх наведених тут відповідей, я хотів би надати додаткову інформацію - Так, ви насправді можете do, Список списку = новий Список (); Але ціною написання реалізації всіх методів інтерфейсів. Поняття не просто список списку = новий список (); але

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 . Це правильно, коли хтось заявляє: Ні, ви не можете інстанціювати інтерфейс, і це правильно. Але ви ніколи не можете сказати, що ви CANT пишете список списку = новий список (); але, очевидно, ви можете це зробити, і це важко сказати, що ви цього не можете зробити .


Щоб було зрозуміло, це не створює об'єкт, фактичним типом якого є List. Швидше, він оголошує новий клас, який не має імені та реалізує List, а під час виконання створює новий об'єкт новозакладеного класу.
Radiodef

0

Ми створили soyuz-to для спрощення 1 проблеми: як перетворити Xв Y(наприклад, Stringв Integer). Побудова об'єкта також вид перетворення тому вона має просту функцію для побудови Map, List, Set:

import io.thedocs.soyuz.to;

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

Перевірте, чи є в ньому багато інших корисних функцій

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