List<Integer> mylist = new ArrayList<Integer>();
ArrayList<Integer> mylist2 = new ArrayList<Integer>();
我想知道Java集合API中上述两者之间的实际区别是什么。我是 Java 集合 API 的新手。我知道 List 是 ArrayList 类实现的接口。
List<Integer> mylist = new ArrayList<Integer>();
ArrayList<Integer> mylist2 = new ArrayList<Integer>();
我想知道Java集合API中上述两者之间的实际区别是什么。我是 Java 集合 API 的新手。我知道 List 是 ArrayList 类实现的接口。
List<Integer>
版本是接口类型——它只允许你执行接口声明的方法,而类型ArrayList<Interger>
化变量允许你做任何在 theArrayList<Interger>
和它的 supers 中声明的事情。(List
当然包括)。
然而,尽管选择第一个似乎“没用”——它实际上让你有更大的灵活性LinkedList<Interger>
——如果你以后决定你想要一个(例如)而不是一个ArrayList<Interger>
作为动态类型,它将帮助你更容易地改变你的设计。
补充:
当然不代表你需要自动选择List<Integer>
版本。如果您确实需要使用确切的类型ArrayList
- 您应该选择它。一个好的经验法则是从接口版本开始,然后将其更改为ArrayList<Integer>
仅当您发现自己在努力获得使用类型很容易完成的事情时ArrayList
(或者如果您发现自己转换为ArrayList
...)
在您的声明 1 中,由于您指mylist
的是List<Integer>
while it is still ArrayList<Integer>
,因此您只能使用接口中可用的方法。List
如果您使用的是 cross class.method 功能,这是更好的说法。
此外,任何接受的方法List<Integer>
都可以接受List
例如LinkedList<Integer>
或您的自定义实现类的任何实现类。
您的第二条语句仅创建和引用该对象ArrayList<Integer>
。有些人更喜欢mylist
在方法中本地使用它时。
始终对接口进行编码。
(汽车类比警报)
你走进赫兹租车公司。你说,我想要一个IVehicle
。他们说,“嗯,什么样的IVehicle
?” 你不在乎。所以他们给你一个DumpTruck
. 但是你不想要一辆自卸卡车,你想要一些紧凑的东西。你想要一个ICompact
可以扩展的IVehicle
. 所以他们给你一辆摩托车。“不!” 你惊呼,“我想要一个ICar
!” “什么样的ICar
?” 他们问。“我不在乎!” 你惊呼。所以他们给你一个FordCar
,你从此过上幸福的生活。
这样就清楚了吗?
第一个称为接口编码。
在整个代码中使用List
引用,您可以将具体实现更新为其他内容,例如 aLinkedList
而不会破坏您的客户端代码。
您可以将其视为多态性。
List<Integer> mylist
声明它是一个 List,但它不必是一个 ArrayList - JVM 只知道它实现了 List 接口。
ArrayList<Integer> mylist2
声明它是一个 ArrayList,所以 JVM 知道它不仅是一个 List,而且特别是一个 ArrayList。
我知道 List 是 ArrayList 类实现的接口。
这正是区别:)
当您在代码中使用两个变量 (mylist) 和 (mylist2) 时,您将可以访问 ArrayList 定义的任何方法,这些方法不属于 mylist2 上的基本 List 接口的一部分。
对于myList
,您将只能调用List
接口的方法。
例如,您不能调用ensureCapacity
myList 上的方法。