答案 0 :(得分:10)
没有,从创作的角度来看。两者都创建ArrayList
。
不同之处在于,在第二个示例中,al
允许访问List
接口上实现的所有方法,而在第一个示例中,al
允许访问所有(可访问的) )ArrayList
类的方法和字段。
实用的经验法则:使用第二种模式。如果你需要ArrayList
实现中的一些额外的好东西,那么你总是可以施放:
List list = new ArrayList();
// do some adds/removes/... on the list
((ArrayList) list).trimToSize();
答案 1 :(得分:7)
它被称为接口编程。假设您需要从方法中返回此list
。因此,调用代码可以将其转换为List
变量。
public ArrayList getList() {
ArrayList list = new ArrayList();
// do something with the list here
return list;
}
而且,
public List getList() {
List list = new ArrayList();
// do something with the list here
return list;
}
现在对于后一种方法,调用代码可以在List
类型变量中包含返回的列表。你可以稍后轻易地决定,出于某种原因,这样的事情,
public List getList() {
List list = new LinkedList();
// do something with the list here
return list;
}
调用代码没有变化,而前者需要更改返回类型,这最终会搞砸调用代码。
答案 2 :(得分:7)
将关于Map
与HashMap
的{{3}}解释为my answer:
对象之间没有区别。您对该对象的接口有所不同。在第一种情况下,界面为ArrayList
,而在第二种情况下,界面为List
。但是,底层对象是相同的。
使用List
的好处是,您可以将基础对象更改为不同类型的列表,而不会违反与使用它的任何代码的合同。如果您将其声明为ArrayList
,则如果要更改基础实现,则必须更改合同。