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

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

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

4

7 回答 7

8

List<Integer>版本是接口类型——它只允许你执行接口声明的方法,而类型ArrayList<Interger>化变量允许你做任何在 theArrayList<Interger>和它的 supers 中声明的事情。(List当然包括)。

然而,尽管选择第一个似乎“没用”——它实际上让你有更大的灵活性LinkedList<Interger>——如果你以后决定你想要一个(例如)而不是一个ArrayList<Interger>作为动态类型,它将帮助你更容易地改变你的设计。


补充:
当然不代表你需要自动选择List<Integer>版本。如果您确实需要使用确切的类型ArrayList- 您应该选择它。一个好的经验法则是从接口版本开始,然后将其更改为ArrayList<Integer>仅当您发现自己在努力获得使用类型很容易完成的事情时ArrayList(或者如果您发现自己转换为ArrayList...)

于 2012-12-04T18:50:52.493 回答
2

在您的声明 1 中,由于您指mylist的是List<Integer>while it is still ArrayList<Integer>,因此您只能使用接口中可用的方法。List如果您使用的是 cross class.method 功能,这是更好的说法。

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

您的第二条语句仅创建和引用该对象ArrayList<Integer>。有些人更喜欢mylist在方法中本地使用它时。

于 2012-12-04T18:51:03.147 回答
2

始终对接口进行编码。

(汽车类比警报)

你走进赫兹租车公司。你说,我想要一个IVehicle。他们说,“嗯,什么IVehicle?” 你不在乎。所以他们给你一个DumpTruck. 但是你不想要一辆自卸卡车,你想要一些紧凑的东西。你想要一个ICompact可以扩展的IVehicle. 所以他们给你一辆摩托车。“不!” 你惊呼,“我想要一个ICar!” “什么样的ICar?” 他们问。“我不在乎!” 你惊呼。所以他们给你一个FordCar,你从此过上幸福的生活。

这样就清楚了吗?

于 2012-12-04T19:07:29.907 回答
1

第一个称为接口编码。

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

于 2012-12-04T18:50:06.263 回答
1

您可以将其视为多态性。

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

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

于 2012-12-04T18:51:28.793 回答
0

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

这正是区别:)

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

于 2012-12-04T18:51:11.153 回答
0

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

例如,您不能调用ensureCapacitymyList 上的方法。

于 2012-12-04T18:51:22.617 回答