嗨,我对以下两个概念区别不是很清楚,
List<String> list = new ArrayList<String>();
和
ArrayList<String> list = new ArrayList<String>();
嗨,我对以下两个概念区别不是很清楚,
List<String> list = new ArrayList<String>();
和
ArrayList<String> list = new ArrayList<String>();
List<String> list = new ArrayList<String>();
创建一个字符串类型的列表,该列表可以被潜在地强制转换为任何其他类型的列表。这被称为解耦。您正在将代码从接口的特定实现中解耦。它提供的优势是,在编写大量代码时,可以根据偏好(速度、内存等)在各种类型的列表之间进行切换,因为所有代码都可以将列表视为类型List。您还可以将列表作为参数传递并从函数返回列表。如果以后不满意ArrayList,则只需更改那一行代码即可。
List<String> list = new ArrayList<String>(); // old code
List<String> list = new LinkedList<String>(); // new code
// The rest of the code doesnt need changing
...
list = getList();
...
public List<String> getList() {
List<String> temporaryList;
...
return temporaryList;
}
public void changeList(List<string> localListVariable) {}
而且您的程序将按预期运行。
另一方面,
ArrayList<String> list = new ArrayList<String>();
创建了一个String类型的ArrayList,它不能用作任何其他类型的List(Vector,LinkedList等)。因此,它受到可用于ArrayList的方法的限制。
如果现在希望更改使用的列表类型,则必须在整个程序中更改所有函数参数和返回类型等内容(无论您何时不得不创建一个ArrayList<String>
来使用您的变量)。
List<String>
是 ArrayList<String>
的超类(或可能是有效的接口)。将 ArrayList<String>
的实例分配给 List<String>
变量是允许的。这在某种程度上是一种动态转换的形式。当访问 List<String> list
时,只能使用与 List<String>
相关的方法;尽管对象是 ArrayList<String>
的实例,但来自 ArrayList<String>
的方法将被隐藏。
ArrayList
对象。但是List<String> list = new ArrayList<String>();
将使用List<String>
的引用来引用对象,而ArrayList<String> list = new ArrayList<String>();
将使用类型为ArrayList<String>
的引用变量来引用对象。ArrayList<String>
的引用调用名为ensureCapacity
的方法,但是您不能使用List<String>
的引用这样做。ArrayList<String> list = new ArrayList<String>();
list.ensureCapacity(10); // This will work
List<String> list = new ArrayList<String>();
list.ensureCapacity(10); // This will not compile
ArrayList
对象而不是List
对象,尽管ArrayList
IS-A List
。因此,在这种情况下,List
对象和ArrayList
对象之间没有任何区别。 - Rahul BobhateArrayList 会创建一个 ArrayList 类型的对象,而 List 会创建一个 List 类型的对象,ArrayList 是基于 List 接口实现的。如果您不知道什么是接口,请查阅 javadocs。