List和List 之间的Java差异

java中的ListList什么区别?

原始类型的一个特殊危险(例如,没有 List )是原始类型甚至在它们自己的声明之外禁用检查

参考: 一个Java Puzzler ,显示原始类型的危险。 (从第13页开始)简短版本:因为在语句中使用了原始类型,编译器没有评估其他地方的generics类型,因此发生了奇怪的运行时exception。

简短的回答:这是一个使用原始类型的警告,这是有充分理由的。 使用与原始类型List强烈偏好的无界通配符List

假设你有两个列表:

ListmainList = new ArrayList();

和一个原始类型:

List rawList = new ArrayList();

现在让我们做这样的事情:

 List intList = new ArrayList(); intList.add(42); mainList.addAll(intList); rawList.addAll(intList); 

但是还有一个包含String对象的列表:

List strList = new ArrayList()

当我们试着打电话

strList.addAll(mainList)

我们得到一个编译错误:

The method addAll(Collection) in the type List is not applicable for the arguments (List)

但如果我们试着打电话

strList.addAll(rawList)

我们只收到一个警告。

因此,如果您只在应用程序中使用对象列表,那么列表和列表之间实际上没有区别。 但是从Java 1.5开始,使用generics为您的应用程序提供编译时类型安全性是个好主意。

差异非常微妙。 两者中较为明显的是List ,它是一个任意对象的列表(因为每个类都有Object作为超类)。 现在List的不同之处在于List是无类型的,因此根本不执行任何类型检查,这最终会导致某些警告,并可能导致奇怪的运行时行为。 虽然Java知道List是一个可能包含任何内容的List ,但它并不知道有关List 。 因为如果你考虑“旧式”Java,你所知道的就是调用List以前只调用List 。 这就是这两者之间的区别…… List被定义为包含有意义的广泛对象,而List不是。

我希望能够澄清这个问题。 如果没有,请告诉我们还有什么不清楚。 🙂

Java中的generics对于更好地进行错误检查(在编译时)非常重要,因为在运行时检查和调试期间花费的时间更少。

因此,没有直接的性能提升,但您很快就能发现错误。

底线:它有助于加快开发速度。

我强烈建议您仔细阅读 : Java编程语言中的generics[pdf]

区别在于:

 List a = new ArrayList(); List b = a; // compile error List c = a; // fine 

List与任何其他参数的List不兼容。 但是,原始List与所有参数的List兼容。

关于原始类型,有一些特殊的处理方法; 没有动力将它们全部列举,因为无论如何都不鼓励原始类型。

让我们谈谈一个更狭窄的问题,这可能是最相关的:给定一个对象,我们主要关心的是我们可以调用哪些方法; 为此目的,如果它的类型是ListList ,有什么区别吗?

List的方法是List方法,其中E替换为Object; 原始类型List的方法是List的方法的擦除。 所以我们有

 List List boolean add(Object) boolean add(Object) Object get(int) Object get(int) int size() int size() boolean addAll(Collection) boolean addAll(Collection) ... ... 

他们的大部分方法都是一样的! 在这方面,这两种类型很难区分。