声明List <Integer>与ArrayList <Integer>之间有什么区别?

use*_*712 7 java collections

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

ArrayList<Integer> mylist2 = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

我想知道java collections API中上面两者之间的实际区别是什么.我是java collections API的新手.我知道List是ArrayList类实现的接口.

ami*_*mit 7

List<Integer>版本是接口类型-只允许您执行由接口声明的方法,而该ArrayList<Interger>类型的变量允许你这样做是在宣布任何东西ArrayList<Interger>和它的超类.(List当然包括).

然而,尽管选择第一个似乎"毫无用处" - 它实际上允许您更灵活 - 如果您稍后决定要LinkedList<Interger>(例如)而不是ArrayList<Interger>动态类型,它将帮助您更轻松地更改设计.


增加:
当然这并不意味着你需要自动选择List<Integer>版本.如果你确实需要使用确切的类型ArrayList- 你应该选择它.一个好的经验法则是从界面版本开始,并将它更改为ArrayList<Integer>唯一的,如果你发现自己在一个ArrayList类型上很容易做到的事情(或者如果你发现自己投射到ArrayList......)


Yog*_*ngh 2

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

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

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