用Java声明集合

用Java声明集合,java,list,arraylist,collections,Java,List,Arraylist,Collections,我不知道如何寻找答案 以下声明之间有什么区别 List<Integer> al = new ArrayList<Integer>(); ArrayList<Integer> al = new ArrayList<Integer>(); List al=new ArrayList(); ArrayList al=新的ArrayList(); 我有时会看到第一个声明被使用,但由于ArrayList从它的超接口和超类继承了方法,我不知

我不知道如何寻找答案

以下声明之间有什么区别

    List<Integer> al = new ArrayList<Integer>();
    ArrayList<Integer> al = new ArrayList<Integer>();
List al=new ArrayList();
ArrayList al=新的ArrayList();

我有时会看到第一个声明被使用,但由于ArrayList从它的超接口和超类继承了方法,我不知道为什么会使用它。有人能澄清一下吗?谢谢

您不应该依赖于接口的实现。如果使用
List al=new ArrayList()-您可以轻松更改实现,而不会影响所有其他代码,因为您只使用
列表中定义的方法

使用
ArrayList al=new ArrayList(),您将绑定到接口的一个实现,并且您的类与实现的耦合将更加紧密,这通常是必须避免的。

当您使用:

        List<Integer> al = new ArrayList<Integer>();
List al=new ArrayList();
用面向对象的术语来说,它提供了更多的灵活性——它利用了多态性的特性。列表是一个接口,ArrayList、LinkedList等是它的不同实现。在一个人的程序中,如果a1被声明为如上所述,那么出于某种原因,如果一个人决定使用其他列表实现而不是ArrayList,那么他只需要进行以下更改:

       List<Integer> al = new LinkedList<Integer>();
List al=new LinkedList();
与后一种声明不同,使用a1的地方不需要更改


希望有帮助

第一个声明使用接口作为引用类型,该类型更具可移植性,但不提供对ArrayList特定方法的访问。它使您可以在不影响应用程序其他部分的情况下更改列表的实现

第二个类将类定义为reference类型。所有依赖于此引用类型的代码在更改时都需要更改

提示:另外,如果您使用的是Java SE 7或更高版本,则可以在构造部分中使用泛型类型:

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

这种特定类型的代码差别不大,但对于使用
al
的以下代码,差别在于代码是否可以依赖于
列表中定义的接口或类
数组列表定义的接口,这将打开更多的实现细节

此外,一个实际的例子是,您不自己构造
al
,而是让一个方法来构造它,这样方法创建者就必须决定返回类型是具体类型还是接口类型,以及他对方法的实现与方法的用户之间的关系有多紧密

例如:

public ArrayList<String> createArrayList() {
    return new ArrayList<String>(); // is bound to the return type and a change my break code relying on the methods contract
}

public List<String> createList() {
    return new ArrayList<String>(); // can be changed to any other List implementation as the code relying on the method contract can only assume implementations of List
}
publicArrayList createArrayList(){
return new ArrayList();//绑定到返回类型,并根据约定方法更改我的中断代码
}
公共列表createList(){
return new ArrayList();//可以更改为任何其他列表实现,因为依赖方法约定的代码只能假定列表的实现
}

请阅读Java中的“运行时多态性”和“动态方法调度”。谢谢你的帮助

因为明天会有人想把它改成
LinkedList
CopyOnWriteArrayList
MagicFaryList
。这是一种多态性。