ArrayList<Integer> a = new ArrayList<>(); 之间的区别和 List<Integer> a = new ArrayList<>();

Difference between ArrayList<Integer> a = new ArrayList<>(); and List<Integer> a = new ArrayList<>();

我想知道,这两者有什么区别:

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

另外,我想知道这两者的区别,ArrayList a = new ArrayList();

两者没有太大区别:

ArrayList<Integer> a = new ArrayList<>()List<Integer> a = new ArrayList<>()

但是建议使用接口而不是实现,像这样:

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

此外,最佳做法是使用 var 而不是 type:

var a = new ArrayList<Integer>();

ArrayList a = new ArrayList() 的情况下,您创建一个列表而不指定类型。也就是说这个列表可以包含多种类型的数据。

这是前两个数组列表的区别。在前两个列表中,您将无法添加 - 例如 - 字符串,只能添加整数。

从概念上讲,这两个语句在代码时间(当您编程时)和编译时间上有所不同。

当你声明更深层次的(在继承方面)变量类型时,你根本不会丢失任何东西。因此,您可以使用 ArrayList 的所有方法并查看 IDE.

提供的文档

当你声明浅(在继承方面)变量类型时,你“擦除它的实际类型”。但不是真的。在运行时,您可以使用反射恢复它:

List<Integer> simpleList = new ArrayList<>();
System.out.println(simpleList.getClass().getName());
// java.util.ArrayList

当你使用 list 时,它的行为仍然像 ArrayList(因为 它是 ArrayList)。但是现在你把它当作List来使用(在SOLID中代表L:Liskov替换原则)。

但是如果你声明一个函数,不要使用 ArrayList,因为没有人能够传递 LinkedList(啊哈,开玩笑)或 Deque 或 Arrays.ArrayList 或他们会使用的任何东西。

ArrayList a = new ArrayList();等于ArrayList<Object> a = new ArrayList<>();

这叫做原始使用参数化class。并且不建议这样做,即使你希望你的 ArrayList 是 Object 类型。