声明List 与ArrayList 之间有什么区别?
List mylist = new ArrayList(); ArrayList mylist2 = new ArrayList();
我想知道java collections API中上面两者之间的实际区别是什么。 我是java collections API的新手。 我知道List是ArrayList类实现的接口。
在语句1中,由于您将mylist
称为List
而它仍然是ArrayList
, 因此您只能使用List
接口中可用的方法。 如果您使用的是cross class.methodfunction,那么这是更好的说法。
此外,任何接受List
方法都可以接受List
任何实现类,例如LinkedList
或您的自定义实现类。
您的第二个语句,创建并引用该对象为ArrayList
ONLY。 当在该方法中本地使用mylist
时,有些人会发现它。
List
版本是接口类型 – 它只允许您执行接口声明的方法,而ArrayList
类型变量允许您执行在ArrayList
及其supers中声明的任何操作。 (包括课程List
)。
然而,尽管选择第一个似乎“没用” – 它实际上允许你更灵活 – 如果你以后决定你想要一个LinkedList
(例如)而不是一个ArrayList
,它将帮助你更容易地改变你的设计ArrayList
作为动态类型。
加成:
当然,这并不意味着您需要自动选择List
版本。 如果您确实需要使用确切类型的ArrayList
– 您应该选择它。 一个好的经验法则是从接口版本开始,并且只有当你发现自己在使用ArrayList
类型(或者如果你发现自己投射到一个类似的东西时才能获得一些东西)时,将其更改为ArrayList
ArrayList
…)
始终编码到界面。
(汽车比喻警报)
你走进Hertz Rent-a-Car。 你说,我想要一个IVehicle
。 他们说,“好吧,什么样的IVehicle
?” 你不在乎。 所以他们给你一个DumpTruck
。 但是你不想要一辆自卸卡车,你想要一些紧凑的东西。 你想要一个扩展IVehicle
的ICompact
。 所以他们给你一辆摩托车。 “没有!” 你惊呼,“我想要一个ICar
!” “什么样的ICar
?” 他们问。 “我不在乎!” 你惊叹。 所以他们给你一辆FordCar
,你永远幸福地生活。
这清楚了吗?
第一个称为接口编码。
在整个代码中使用List
引用,您可以将具体实现更新为LinkedList
类的其他内容,而不会破坏您的客户端代码。
我知道List是ArrayList类实现的接口。
这正是差异:)
当您在代码中使用两个变量(mylist)和(mylist2)时,您可以访问ArrayList定义的任何方法,这些方法仅在mylist2上不属于基本List接口的一部分。
对于myList
,您只能调用List
接口的方法。
例如,您无法在myList上调用方法ensureCapacity
。
您可以将其视为多态。
List
声明为List,但它不必是ArrayList – JVM只知道它实现了List接口。
ArrayList
声明它是一个ArrayList,因此JVM知道它不仅是一个List,而且特别是一个ArrayList。