在多态和正常情况下声明arrayList之间的差异?

时间:2012-05-26 20:24:37

标签: java arraylist polymorphism

在多态声明arrayList之间有什么区别:

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

和那样的正常风格:

ArrayList<String> stuff = new ArrayList<String>();

7 个答案:

答案 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)

在声明中使用接口时存在一些差异:

  • 表示最重要的是什么。如果您需要仅在具体子类中可用的特定方法,请将其声明为此类。
  • 允许您以最小的更改交换其他实施(LinkedListCopyOnWriteList)。
  • 由于多态性导致的性能损失。

鉴于上述情况,使用接口声明方法参数和返回类型以隐藏不重要的实现细节并最小化限制。仅当性能超临界或者您需要其提供的其他方法时,才使用实际类声明局部变量。如果您稍后选择其他具体类,则需要更改对构造函数的调用,该构造函数可能与声明位于同一行。