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

Posted

技术标签:

【中文标题】如何在 Java 中初始化 List<String> 对象?【英文标题】:How to initialize List<String> object in Java? 【发布时间】:2012-11-03 21:51:29 【问题描述】:

我无法像下面的代码那样初始化列表:

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

我遇到以下错误:

无法实例化类型List&lt;String&gt;

如何实例化List&lt;String&gt;

【问题讨论】:

【参考方案1】:

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

Interface List<E>

成为interface 意味着它不能被实例化(不可能有new List())。

如果您检查该链接,您会发现一些实现 Listclasses:

所有已知的实现类:

AbstractListAbstractSequentialListArrayListAttributeListCopyOnWriteArrayListLinkedListRoleListRoleUnresolvedListStackVector

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

最常用的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

【讨论】:

Arrays.asList 很棒,但正如您现在应该注意到的那样,在int[] a = 1,2,3; System.out.println(Arrays.asList(a)); // [[I@70cdd2] 等情况下,它并没有达到预期的效果 @J.A.I.L.这不是正在发生的事情。这是一个元素的列表,其中一个元素是一个整数数组。想要的行为可能是三个元素 1、2 和 3 的列表。 @Christoffer Hammarström 打印一个列表或一个数组,你可以使用 java.util.Arrays.toString(array);,所以这个特性已经给出了.. 一些不受欢迎的 Vector 用法,例如 this 和 here。因为线程问题 如果您需要将结果列表设为ArrayList,请使用new ArrayList&lt;&gt;(Arrays.asList("sup1", "sup2", "sup3"))【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

您将需要使用ArrayList&lt;String&gt; 等。

List&lt;String&gt; 是一个接口。

使用这个:

import java.util.ArrayList;

...

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

【讨论】:

【参考方案5】:

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

喜欢:

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

【讨论】:

【参考方案6】:

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

JDK 7 之前的版本

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

JDK 7 及更高版本可以使用菱形运算符

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

更多信息写在这里Oracle documentation - Collections

【讨论】:

【参考方案7】:

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

ArrayList - 在数组上实现的列表

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

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

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

【讨论】:

【参考方案8】:

取决于你想使用什么样的列表,比如

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

应该让你去。

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

【讨论】:

【参考方案9】:

如果你只想创建一个不可变 List&lt;T&gt; 里面只有一个 对象,你可以使用这个API:

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

更多信息:docs

【讨论】:

【参考方案10】:

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

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

这些是一些 List 实现的类,

ArrayList, LinkedList, Vector

您可以根据自己的要求使用其中任何一种。这些每个类都有自己的特点。

【讨论】:

一些不受欢迎的 Vector 用法,例如 this 和 here。因为线程问题【参考方案11】:

以防万一,还有人在这个问题上徘徊。因为,我看到一两个新用户再次问同样的问题,然后每个人都说,不,你不能那样做,亲爱的谨慎,除了这里给出的所有答案,我想提供附加信息 - 是的,您实际上可以这样做,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;
        

.....等等(不能写所有方法。)

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

【讨论】:

需要明确的是,这不会创建一个实际类型为List 的对象。相反,它声明了一个没有名称并实现List 的新类,并在运行时创建新声明的类的新对象。【参考方案12】:

而不是:

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

如果您使用的是最新的 JDK,请写下:

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

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

【讨论】:

【参考方案13】:

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

import io.thedocs.soyuz.to;

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

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

【讨论】:

以上是关于如何在 Java 中初始化 List<String> 对象?的主要内容,如果未能解决你的问题,请参考以下文章

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

java 数组如何去除重复的数据?

如何在Java中初始化List 对象

(java) ArrayList 分解,结果转换成 二维数组!!!

Java Stringstring[]List初始化方法

java如何在String数组中取得指定内容的下标?