OOP:ArrayList al = new ArrayList()和List al = new ArrayList()之间的区别?
可能重复:
列表与ArrayList
之间的区别
ArrayList al = new ArrayList()
和
List al = new ArrayList() ?
没有,从创作的角度来看。 两者都创建ArrayList
的实例。
不同之处在于,在第二个示例中, al
允许访问List
接口上实现的所有方法,而在第一个示例中, al
允许访问ArrayList
类的所有(可访问)方法和字段。
一个实用的经验法则:使用第二种模式。 如果你需要一些来自ArrayList
实现的额外好东西,那么你总是可以强制转换:
List list = new ArrayList(); // do some adds/removes/... on the list ((ArrayList) list).trimToSize();
它称为编程接口。 假设您需要从方法中返回此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; }
调用代码没有变化,而前者需要更改返回类型,这最终会搞砸调用代码。
解释我对这个关于Map
vs. HashMap
类似问题的 回答 :
对象之间没有区别。 您对该对象的界面有所不同。 在第一种情况下,接口是ArrayList
,而在第二种情况下,它是List
。 但是,底层对象是相同的。
使用List
的优点是,您可以将基础对象更改为不同类型的列表,而不会违反与使用它的任何代码的合同。 如果将其声明为ArrayList
,则必须更改合同,如果要更改基础实现。