List<Integer> mylist = new ArrayList<Integer>();
ArrayList<Integer> mylist2 = new ArrayList<Integer>();
我想知道java collections API中上面两者之间的实际区别是什么。我是java collections API的新手。我知道List是ArrayList类实现的接口。
答案 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。