Java中的ArrayList,List和Collection几乎以相同的方式运行,并且它们有许多共同的方法。如果是这样的话,那么它们之间的主要区别是什么?以下简单的代码片段演示了它。
package collections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
final public class Main
{
public static void main(String[] args)
{
Collection<String> collection=new ArrayList<String>();
List<String>list=new ArrayList<String>();
ArrayList<String>arrayList=new ArrayList<String>();
collection.add("A");
collection.add("B");
list.add("A");
list.add("B");
arrayList.add("A");
arrayList.add("B");
Iterator<String>collectionIterator=collection.iterator();
Iterator<String>listIterator=list.iterator();
Iterator<String>arrayListIterator=arrayList.iterator();
while(collectionIterator.hasNext())
{
System.out.println(collectionIterator.next());
}
while(listIterator.hasNext())
{
System.out.println(listIterator.next());
}
while(arrayListIterator.hasNext())
{
System.out.println(arrayListIterator.next());
}
}
}
何时何地使用ArrayList,Collection和List?在哪些具体情况下,它们之间的差异可能会很显着?
答案 0 :(得分:10)
Collection
是定义最高级别共享集合行为的接口,并扩展Iterable
(仅定义iterator()
方法)。
List
是定义共享List
行为的最高级别的接口。
ArrayList
是List
的实现,除非您需要实施保证,否则通常不会用于声明(例如, ,快速索引访问),但可以用作列表值。
阅读文档以查看差异 - 他们在API中进行了描述。实现(ArrayList
)将在其实现的每个接口中具有特定于类型的每个方法的实现。
通常,使用提供所需内容的最少特定接口。例如,传递Collection
而不是List
允许更广泛的实现选择。如果您需要索引访问权限(例如List.get(int)
),则Collection
将无效。
与大多数事情一样,使用哪种方法完全取决于您的需求。
答案 1 :(得分:6)
对于局部变量,它并不重要。当类型是API的一部分时,即在可能由尚未编写的代码调用的方法签名中,这很重要:
Collection
有一个非常简单的契约 - 它基本上只暗示你有一堆元素,你可以添加和删除元素,检查集合是否包含特定元素,并迭代它们。如果这是您的所有代码需求,请使用Collection
- 它为使用您API的代码提供了最大的自由。List
在其合约中有一个订单,除了通过显式操作之外不会改变,你可以get()
第{n}个元素,add()
放置最后的新元素等。如果您的代码依赖于任何这些属性,则应使用List
ArrayList
只是List
的具体实现,绝不应该在API中使用。它的用法应该只是一个实现细节(除非你有一些非常具体的要求)。在Collection
,Set
,List
和各种实现之间转换集合时,不仔细考虑API中使用的类型会导致大量无意义的转换和不必要的代码变慢这些类只是为了满足设计糟糕的API。
答案 2 :(得分:2)
您在所有3个案例中都使用了ArrayList
。
为了进一步解释,Collection<String> collection=new ArrayList<String>();
可以重写为,
Collection<String> collection;
collection = new ArrayList<String>();
第一个语句定义名为Collection<String>
的{{1}}类型的变量,而第二个语句创建collection
并将其分配给new ArrayList<String>()
。
编译器允许将collection
分配给ArrayList<String>
因为Collection<String>
is-a ArrayList
,即所有ArrayLists都是集合,因为它们实现了Collection { {3}}。反过来显然不正确,所有集合绝对不是ArrayLists。
答案 3 :(得分:2)
ArrayList
是一个实现,Collection
和List
是接口。
Collection
有点超级界面,List
作为特化(有序Collection
)。 ArrayList
是List
(可调整大小的数组)的实现。
答案 4 :(得分:1)
Collection
和List
是接口。 ArrayList
是一个班级。我们不能new Collection()
或new List()
。但我们可以new ArrayList()
。
Collection
没有索引概念。 List
和ArrayList
有一个可以设置/获取索引的方法。例如,Collection
有add(object)
。 List
和ArrayList
有add(object)
和add(index, object)
。