1

这两者有区别吗?如果是这样,它是什么?

List<Integer> x = new ArrayList<Integer>();

ArrayList<Integer> x = new ArrayList<Integer>();
4

4 回答 4

2

第一个声明允许您编程接口。它确保稍后您可以安全地替换ArrayList为 ,LinkedList并且其余代码将被编译。

第二个声明允许您对类进行编程,因此您可能会使用ArrayList不实现List接口的方法。例如,您可以调用ensureCapacity()声明为 的列表ArrayList,但不能调用声明为 的列表List。尽管通常应该首选接口编程,但如果您必须调用特定于类的方法,这样做并没有错:例如,ensureCapacity()如果您知道列表的新目标大小,调用能力可以节省一些不必要的重新分配。

于 2013-05-09T17:07:48.823 回答
0

前者是首选。它允许在不更改依赖于该字段的代码的情况下更改实现。

Effective Java 中, Joshua Bloch 说:

如果存在适当的接口类型,则参数、返回值、变量和字段都应使用接口类型声明。

...

如果您养成使用接口作为类型的习惯,您的程序将更加灵活。

于 2013-05-09T17:07:27.623 回答
0

如果您对接口进行编码,那么您可以毫不费力地更改实现

List<Integer> x = new ArrayList<Integer>();

您现在可以使 x 指向 LinkedList 或仅用一行代码的任何其他 List 实现。如果您需要 ArrayList 中的特定方法,那么将 ArrayList 放在左侧是完全可以接受的。100 次中有 99 次认为你不会,所以首选 List

于 2013-05-09T17:09:03.170 回答
0

有了ArrayList您可以指定一个intitalsize,因此 ArrayList 有trimToSize()方法将其大小修剪为当前大小。List<Integer>您将无法修剪大小,除非您将其转换回ArrayList

于 2013-05-09T17:10:15.390 回答