这两者有区别吗?如果是这样,那是什么?声明中List和ArrayList的区别?
List<Integer> x = new ArrayList<Integer>();
和
ArrayList<Integer> x = new ArrayList<Integer>();
这两者有区别吗?如果是这样,那是什么?声明中List和ArrayList的区别?
List<Integer> x = new ArrayList<Integer>();
和
ArrayList<Integer> x = new ArrayList<Integer>();
第一个声明让你编程接口。它确保您稍后可以安全地将ArrayList
替换为LinkedList
,其余代码将进行编译。
第二个声明允许您编程到该类,因此您可以使用ArrayList
的方法,该方法不实现List
接口。例如,您可以在声明为ArrayList
的列表上呼叫ensureCapacity()
,但不能在声明为List
的列表上呼叫。尽管通常编程接口应该是首选,但如果您必须调用特定于类的方法,则没有任何问题:例如,如果知道列表的新目标大小,调用ensureCapacity()
的能力可以节省一些不必要的重新分配。
前者是优选的。它允许更改实现而不更改依赖于该字段的代码。
在有效的Java,约书亚·布洛克说:
如果存在合适的接口类型,那么参数,返回值,变量和字段都应该使用接口类型声明。
...
如果你进入使用接口作为类型的习惯,你的程序将更加灵活。
如果你的代码接口,那么你可以改变实现,没有什么麻烦
List<Integer> x = new ArrayList<Integer>();
可以使X现在指向一个LinkedList或任何其他List实现只用一行代码。如果您需要ArrayList中的特定方法,那么在左边有ArrayList是完全可以接受的。 99次中有100还以为你不会这么列表是首选
随着ArrayList
你可以指定一个intitalsize
等ArrayList中有trimToSize()
方法来削减其大小,以当前size.With List<Integer>
您将无法修剪大小除非你把它扔回ArrayList
这个问题已经被问了太多次了! – 2013-05-09 17:06:58
人们可以看到有2个问题和2个答案,但他们仍然想发布另一个答案,geez ... – 2013-05-09 17:10:18