从使用的角度,只是在可调用的方法上有差异:
使用List声明变量,只能调用到List中声明的方法,而ArrayList则除了List的方法可用外,还可以使用自己独有的方法(除了实现List接口的方法,还有自己新增的一些方法)
关于二者的使用场景,楼主可以先了解下java中多态的思想。这里简单说下。多态主要建立在继承的基础上,如声明一个类或接口A,让A1,A2,A3三个类都继承(或实现)A,则声明对象时,可以使用 A a = new A1(), A a = new A2() A a = new A3()。这里的a变量可表现出一种多态形式,即可以表示A1或A2或A3
下面再说下使用场景:
一.2种随意用的情况
在不涉及想动态控制实现对象(多态),以及不使用具体实现类的独有方法时,2种方式都可以用。
二、用List的场景
想动态控制实现对象的场景,则需要使用List这种声明形式。
什么是动态控制实现对象,举个例了,现在有个类A,声明如下。
public class A {
private ArrayList list;
public void setList(ArrayList list) {
this.list = list;
}
public ArrayList getList() {
return list;
}
}
还有一个类B,该类使用了A类中的list
public class B {
public void dosomething1() {
A a = new A();
a.setList(new ArrayList());
}
public void dosomething2(A a) {
ArrayList list = a.getList();
System.out.println(list.size());
}
public void dosomething3(A a) {
ArrayList list = a.getList();
System.out.println(list.size());
}
}
假设,现在业务场景中使用ArrayList存在性能问题,需要将ArrayList替换为其他性能较好的实现类,比如修改为LinkedList,则会很麻烦。
1.A类声明要重新调整(对象list类型,get/set参数类型)
2.所有使用了A类的list变量的数据,都得调整(因为是声明为具体实现类的,修改了实现类,声明肯定要改)
这种场景下,就需要使用多态的特性来处理了。如将ArrayList声明修改为List,具体实现不关注。楼主有兴趣的话,可以了解下面向接口编程的思想。
注意:多态的场景下,具体实现类的独有方法将被屏蔽,需要用时,要结合业务场景去考虑可不可以强制转换
三、用ArrayList的场景
想调用ArrayList中独有的方法使用