如何在Java中初始化List <String>对象?


404

我无法按照以下代码初始化列表:

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>

Answers:


733

如果您检查APIList则会注意到它说:

Interface List<E>

作为一种interface手段,它不能被实例化(new List()不可能)。

如果您检查该链接,则会发现一些class实现的List

所有已知的实施类:

AbstractListAbstractSequentialListArrayListAttributeListCopyOnWriteArrayListLinkedListRoleListRoleUnresolvedListStackVector

那些可以实例化。使用它们的链接可以了解有关IE的更多信息:知道哪种更适合您的需求。

三种最常用的可能是:

 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很棒,但是您应该已经注意到,Arrays.asList无法像在情况下那样做int[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D 2014年

1
@JAIL这不是正在发生的事情。那是一个元素的列表,其中一个元素是一个整数数组。该想的行为很可能是三个要素1,2名单和3
克里斯托弗Hammarström

1
@ChristofferHammarström打印列表或数组,你可以使用java.util.Arrays.toString(阵列);,因此,这一特征已经给出..
Maxr1998

1
这样这里有些不鼓励使用Vector 。由于线程问题
Nuno Rafael Figueiredo 2015年

3
如果您需要结果列表为ArrayList,请使用new ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

113

无法实例化接口,但实现很少:

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是一个Interface,您不能实例化一个Interface,因为interface是一个约定,什么样的方法应该具有您的类。为了实例化,您需要该接口的一些实现(实现)。尝试使用下面的代码以及非常流行的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是一个接口,您不能初始化接口。实例化一个实现类。

喜欢:

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


7

根据您要使用的列表类型,类似

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

应该让你走。

List是接口,ArrayList是List接口的一种实现。通过阅读List接口JavaDocs,可以找到更多更适合您需要的实现


7

如果您只想创建一个只有一个对象的不可变 对象,则可以使用以下API:List<T>

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

更多信息:文档


5

列表是一个接口。您不能使用List对其进行初始化。

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

这些是List实施的一些类,

ArrayList, LinkedList, Vector

您可以根据需要使用任何一种。这些每个类都有其自己的功能。


这样这里有些不鼓励使用Vector 。由于线程问题
Nuno Rafael Figueiredo 2015年

3

以防万一,仍然有人在这个问题上徘徊。因为,我看到一个或两个新用户再次问相同的问题,然后每个人都说,不,亲爱的Prudence,除了此处给出的所有答案之外,我还想提供其他信息-是的,您实际上可以做,List list = new List(); 但是以编写所有接口方法的实现为代价。这个概念不只是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类的示例。当有人指出时,它是正确的,不,您不能实例化一个接口,没错。但是你永远不能说,不能写Li​​st list = new List(); 但是,显然您可以做到这一点,这很难说您做不到


不过要明确一点,这不会创建实际类型为的对象List。而是声明一个没有名称的新类并实现List,并在运行时创建新声明的类的新对象。
Radiodef

0

我们建立联盟,以简化1个问题:如何转换XY(例如StringInteger)。的物体的构造的转换种类也所以它有一个简单的函数来构造MapListSet

import io.thedocs.soyuz.to;

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

请检查它-它还有很多其他有用的功能

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.