声明List <integer>与ArrayList <integer>?</integer> </integer>之间有什么区别?

时间:2012-12-04 18:46:12

标签: java collections

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

ArrayList<Integer> mylist2 = new ArrayList<Integer>();

我想知道java collections API中上面两者之间的实际区别是什么。我是java collections API的新手。我知道List是ArrayList类实现的接口。

7 个答案:

答案 0 :(得分:7)

List<Integer>版本是接口类型 - 它只允许您执行接口声明的方法,而ArrayList<Interger>类型变量允许您执行{{1}中声明的任何操作和它的超级。 (当然包括ArrayList<Interger>)。

然而,虽然选择第一个似乎“毫无用处” - 它实际上允许你更灵活 - 如果你以后决定要一个{{1>它将帮助你更容易地改变你的设计(例如)而不是List作为动态类型。


<强>增加:
当然,这并不意味着您需要自动选择LinkedList<Interger>版本。如果您确实需要使用ArrayList<Interger>的确切类型 - 您应该选择它。一个好的经验法则是从界面版本开始,只有当你发现自己在使用List<Integer>类型(或者如果你)时能够很容易地完成某些事情时,才能将其更改为ArrayList。找到自己投射到ArrayList<Integer> ...)

答案 1 :(得分:2)

在您的对帐单1中,由于您将mylist称为List<Integer>,因为它仍为ArrayList<Integer>因此您可以使用List中提供的方法仅限接口。如果您使用跨类方法功能,这是更好的说法。

此外,任何接受List<Integer>的方法都可以接受List的任何实施类,例如LinkedList<Integer>或您的自定义实现类。

您的第二个语句,仅以ArrayList<Integer>创建并引用该对象。当在方法中本地使用mylist时,有些人会认定它。

答案 2 :(得分:2)

始终代码接口。

(汽车类比警报)

你走进Hertz Rent-a-Car。你说,我想要IVehicle。他们说,“好吧,IVehicle是什么?”你不在乎。所以他们给你一个DumpTruck。但是你不想要一辆自卸卡车,你想要一些紧凑的东西。您想要ICompact扩展IVehicle。所以他们给你一辆摩托车。 “没有!”你惊叹道,“我想要一个ICar!” “什么样的ICar?”他们问。 “我不在乎!”你惊叹。所以他们给你一个FordCar,你永远幸福地生活。

这清楚了吗?

答案 3 :(得分:1)

第一个称为接口编码。

在整个代码中使用List引用,您可以在不破坏客户端代码的情况下将具体实现更新为LinkedList之类的内容。

答案 4 :(得分:0)

  

我知道List是ArrayList类实现的接口。

这正是差异:)

当您在代码中使用两个变量(mylist)和(mylist2)时,您可以访问ArrayList定义的任何方法,这些方法仅在mylist2上不属于基本List接口。

答案 5 :(得分:0)

对于myList,您只能调用List接口的方法。

例如,您无法在myList上调用方法ensureCapacity

答案 6 :(得分:0)

您可以将其视为多态性。

List<Integer> mylist声明它是一个List,但它不必是一个ArrayList - JVM只知道它实现了List接口。

ArrayList<Integer> mylist2声明它是一个ArrayList,所以JVM知道它不仅是一个List,特别是一个ArrayList。