声明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 。 但是你不想要一辆自卸卡车,你想要一些紧凑的东西。 你想要一个扩展IVehicleICompact 。 所以他们给你一辆摩托车。 “没有!” 你惊呼,“我想要一个ICar !” “什么样的ICar ?” 他们问。 “我不在乎!” 你惊叹。 所以他们给你一辆FordCar ,你永远幸福地生活。

这清楚了吗?

第一个称为接口编码。

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

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

这正是差异:)

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

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

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

您可以将其视为多态。

List mylist声明为List,但它不必是ArrayList – JVM只知道它实现了List接口。

ArrayList mylist2声明它是一个ArrayList,因此JVM知道它不仅是一个List,而且特别是一个ArrayList。