如何在 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<String>
如何实例化List<String>
?
【问题讨论】:
【参考方案1】:如果您检查API 中的List
,您会注意到它说:
Interface List<E>
成为interface
意味着它不能被实例化(不可能有new List()
)。
如果您检查该链接,您会发现一些实现 List
的 class
es:
所有已知的实现类:
AbstractList
、AbstractSequentialList
、ArrayList
、AttributeList
、CopyOnWriteArrayList
、LinkedList
、RoleList
、RoleUnresolvedList
、Stack
、Vector
其中一些可以实例化(那些未定义为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<>(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<String>
等。
List<String>
是一个接口。
使用这个:
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<T>
里面只有一个 对象,你可以使用这个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
)。对象的构造也是一种转换,所以它有一个简单的函数来构造Map
,List
,Set
:
import io.thedocs.soyuz.to;
List<String> names = to.list("John", "Fedor");
请检查一下 - 它还有很多其他有用的功能
【讨论】:
以上是关于如何在 Java 中初始化 List<String> 对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中初始化 List<String> 对象?