这两者有区别吗?如果是这样,它是什么?
List<Integer> x = new ArrayList<Integer>();
和
ArrayList<Integer> x = new ArrayList<Integer>();
答案 0 :(得分:2)
第一个声明允许您编程接口。它确保您以后可以使用ArrayList
安全地替换LinkedList
,其余代码将进行编译。
第二个声明允许您对该类进行编程,因此您可能会使用ArrayList
未实现List
接口的方法。例如,您可以在声明为ensureCapacity()
的列表上调用ArrayList
,但不能在声明为List
的列表上调用ensureCapacity()
。虽然通常编程接口应该是首选,但如果你必须调用特定于类的方法,那么执行它是没有错的:例如,如果你知道你的新目标大小,调用{{1}}的能力可以节省一些不必要的重新分配。列表。
答案 1 :(得分:0)
前者是首选。它允许更改实现,而无需更改依赖于字段的代码。
在 Effective Java中, Joshua Bloch说:
如果存在适当的接口类型,则应使用接口类型声明参数,返回值,变量和字段。
...
如果您养成使用接口作为类型的习惯,您的程序将更加灵活。
答案 2 :(得分:0)
如果您对接口进行编码,那么您可以毫不费力地更改实现
List<Integer> x = new ArrayList<Integer>();
你现在可以使x指向LinkedList或只有一行代码的List的任何其他实现。如果您需要ArrayList中的特定方法,那么在左侧使用ArrayList是完全可以接受的。 99次中有100次认为你不会这样列表是首选
答案 3 :(得分:0)
使用ArrayList
,您可以指定intitalsize
,因此ArrayList具有trimToSize()
方法,可将其大小调整为当前大小。使用List<Integer>
,您将无法修剪尺寸,除非你把它重新投射到ArrayList