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

我不能在以下代码中初始化一个列表:

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>?

1785170 次浏览

你需要使用ArrayList<String>或类似的方法。

List<String>是一个接口。

用这个:

import java.util.ArrayList;


...


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

List是接口,不能初始化接口。应该实例化一个实现类。

如:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();

List是一个接口,你不能实例化一个接口,因为接口是一个约定,什么方法应该有你的类。为了实例化,您需要该接口的一些实现(实现)。尝试下面的代码与非常流行的List接口实现:

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

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

这取决于你想使用什么样的List,比如

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

应该能让你走了。

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

List是一个接口。你不能使用List来初始化它。

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

这些是List实现的类,

ArrayList, LinkedList, Vector

你可以根据你的需要使用任何一个。这些每一类都有自己的特点。

List只是一个接口,一个通用列表的定义。您需要提供这个列表接口的实现。最常见的两种是:

ArrayList -在数组上实现的列表

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

LinkedList -一个像相互连接的元素链一样实现的列表

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

如果你检查API中的List,你会注意到它说:

Interface List<E>

作为interface意味着它不能被实例化(没有new List()是可能的)。

如果你检查这个链接,你会发现一些实现Listclasses:

所有已知的实现类:

AbstractListAbstractSequentialList ArrayList, AttributeListCopyOnWriteArrayList LinkedList, RoleList, RoleUnresolvedList, Stack Vector

其中一些可以实例化(未定义为abstract class的那些)。使用他们的链接来了解更多关于他们的信息,即:知道哪个更适合你的需求。

最常用的三种可能是:

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

奖金:< p >
你也可以用更简单的方法,使用Arrays class实例化它,如下所示
List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));

但请注意,您不允许向该列表中添加更多元素,因为它是fixed-size

在大多数情况下,你需要简单的ArrayList——List的实现

JDK版本7之前

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

JDK 7及以后版本可以使用菱形操作符

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

进一步的信息写在这里Oracle文档-集合

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

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

更多信息:文档

不能实例化接口,但有几个实现:

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

此外,还有许多其他库(如番石榴)提供的其他方法。

List<String> list = Lists.newArrayList("one", "two", "three");
以防万一,有人还在这个问题上徘徊。因为,我看到一两个新用户再次问同样的问题,每个人都告诉然后,不,你不能那样做,亲爱的普律当丝,除了这里给出的所有答案,我想提供额外的信息- 是的,你实际上可以这样做,List List = new List(); 但是以编写接口的所有方法的实现为代价。 这个概念不是简单的List List = new List();但< / p >
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;
}

…等等(不能写所有的方法。)

这是匿名类的一个例子。它是正确的,当有人说,不,你不能实例化接口,,这是正确的。但你永远不能说,你不能写List List = new List();,但是,显然你可以这样做,这是一个很难做出你做不到的事的陈述。

我们创建soyuz-to来简化一个问题:如何将X转换为Y(例如String转换为Integer)。构造对象也是一种转换,所以它有一个简单的函数来构造MapListSet:

import io.thedocs.soyuz.to;


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

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

而不是:

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

如果你正在使用最新的JDK,请这样写:

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

这是初始化List的正确方法。