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