在多态声明arrayList之间有什么区别:
List<Integer> iL = new ArrayList<Integer>();
和那样的正常风格:
ArrayList<String> stuff = new ArrayList<String>();
答案 0 :(得分:4)
是的,存在差异
带
List<Integer> iL ;
你可以做到
iL = new ArrayList<Integer>();
以及
iL = new LinkedList<Integer>();
优点:
您可以引用是 List
另见
答案 1 :(得分:3)
通常建议使用第一个声明。它允许轻松更改列表的实现,只需通过更改实例化的行。此外,它还表明您没有使用ArrayList
提供的任何其他功能。
使用界面时会有一些性能成本,但在现代虚拟机上它应该几乎不会引起注意。
答案 2 :(得分:2)
是。在第二种情况下,stuff
只能是一个ArrayList。在第一个中,iL
可以是实现List
接口的任何类的实例。
答案 3 :(得分:1)
是。它不仅仅是“编码风格”问题,而其他答案正在喋喋不休......
ArrayList
提供的方法多于List
界面提供的方法(例如trimToSize()
),因此将变量声明为ArrayList
可让您访问这些方法。
通常,除非您需要访问这些特殊方法,否则最好将其声明为List
,遵循将抽象类优先于具体方式声明的模式(允许您随意交换实现) ,例如使用LinkedList
代替
答案 4 :(得分:1)
你只能访问它的列表功能等。
答案 5 :(得分:1)
除了所有这些标准答案“程序到界面”等,写ArrayList
你可能写的List
只是简单的丑陋,所以你最好有理由去做它 - 99%的时间都没有。
答案 6 :(得分:1)
在声明中使用接口时存在一些差异:
LinkedList
或CopyOnWriteList
)。鉴于上述情况,使用接口声明方法参数和返回类型以隐藏不重要的实现细节并最小化限制。仅当性能超临界或者您需要其提供的其他方法时,才使用实际类声明局部变量。如果您稍后选择其他具体类,则需要更改对构造函数的调用,该构造函数可能与声明位于同一行。