用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
。这是一种多态性。