[英]How to initialize List<String> object in 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>
?
如果您检查API for List
,您会注意到它说:
Interface List<E>
作为一个interface
意味着它不能被实例化(不可能有new List()
)。
如果您检查该链接,您会发现一些实现List
的class
:
所有已知的实现类:
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
的。
无法实例化接口,但实现很少:
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");
List 是一个接口,你不能实例化一个接口,因为接口是一个约定,什么方法应该有你的类。 为了实例化,您需要该接口的一些实现(实现)。 使用非常流行的 List 接口实现尝试以下代码:
List<String> supplierNames = new ArrayList<String>();
或者
List<String> supplierNames = new LinkedList<String>();
您将需要使用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>();
在大多数情况下,您需要简单的ArrayList
- List
的实现
在 JDK 版本 7 之前
List<String> list = new ArrayList<String>();
JDK 7 及更高版本可以使用菱形运算符
List<String> list = new ArrayList<>();
更多信息写在这里Oracle 文档 - 集合
List 只是一个接口,是一些通用列表的定义。 您需要提供此列表接口的实现。 最常见的两种是:
ArrayList - 在数组上实现的列表
List<String> supplierNames = new ArrayList<String>();
LinkedList - 一个像互连的元素链一样实现的列表
List<String> supplierNames = new LinkedList<String>();
根据您要使用的列表类型,例如
List<String> supplierNames = new ArrayList<String>();
应该让你去。
List 是接口,ArrayList 是 List 接口的一种实现。 阅读List 接口的 JavaDocs可以找到更多可能更适合您需求的实现。
如果你只想创建一个只有一个对象的不可变List<T>
,你可以使用这个 API:
List<String> oneObjectList = Collections.singletonList("theOnlyObject”);
更多信息: 文档
List 是一个接口。 您不能使用 List 来初始化它。
List<String> supplierNames = new ArrayList<String>();
这些是一些 List impelemented 类,
ArrayList, LinkedList, Vector
您可以根据您的要求使用其中的任何一个。 这些每个类都有自己的特点。
以防万一,任何人仍然徘徊在这个问题上。 因为,我看到一两个新用户再次问同样的问题,然后每个人都说,不,你不能那样做,亲爱的谨慎,除了这里给出的所有答案,我想提供额外的信息 - 是的,你实际上可以做,列表列表=新列表(); 但是以编写接口的所有方法的实现为代价。 这个概念不仅仅是 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<String> supplierNames = new List<String>();
如果您使用的是最新的 JDK,请写下:
List<String> supplierNames = new ArrayList<>();
这是初始化列表的正确方法。
我们创建了soyuz-to来简化 1 个问题:如何将X
转换为Y
(例如String
到Integer
)。 对象的构造也是一种转换,所以它有一个简单的函数来构造Map
、 List
、 Set
:
import io.thedocs.soyuz.to;
List<String> names = to.list("John", "Fedor");
请检查它 - 它还有很多其他有用的功能
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.