Java中的Collection,ArrayList和List之间的主要区别是什么?

时间:2011-11-06 17:28:55

标签: java

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?在哪些具体情况下,它们之间的差异可能会很显着?

5 个答案:

答案 0 :(得分:10)

Collection是定义最高级别共享集合行为的接口,并扩展Iterable(仅定义iterator()方法)。

List是定义共享List行为的最高级别的接口。

ArrayListList实现,除非您需要实施保证,否则通常不会用于声明(例如, ,快速索引访问),但可以用作列表

阅读文档以查看差异 - 他们在API中进行了描述。实现(ArrayList)将在其实现的每个接口中具有特定于类型的每个方法的实现。

通常,使用提供所需内容的最少特定接口。例如,传递Collection而不是List允许更广泛的实现选择。如果您需要索引访问权限(例如List.get(int)),则Collection将无效。

与大多数事情一样,使用哪种方法完全取决于您的需求。

答案 1 :(得分:6)

对于局部变量,它并不重要。当类型是API的一部分时,即在可能由尚未编写的代码调用的方法签名中,这很重要:

  • 类型Collection有一个非常简单的契约 - 它基本上只暗示你有一堆元素,你可以添加和删除元素,检查集合是否包含特定元素,并迭代它们。如果这是您的所有代码需求,请使用Collection - 它为使用您API的代码提供了最大的自由。
  • 类型List在其合约中有一个订单,除了通过显式操作之外不会改变,你可以get()第{n}个元素,add()放置最后的新元素等。如果您的代码依赖于任何这些属性,则应使用List
  • ArrayList只是List的具体实现,绝不应该在API中使用。它的用法应该只是一个实现细节(除非你有一些非常具体的要求)。

CollectionSetList和各种实现之间转换集合时,不仔细考虑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是一个实现,CollectionList是接口。

Collection有点超级界面,List作为特化(有序Collection)。 ArrayListList(可调整大小的数组)的实现。

请参阅Java Tutorials, Trail: Collections, Implementations

答案 4 :(得分:1)

CollectionList是接口。 ArrayList是一个班级。我们不能new Collection()new List()。但我们可以new ArrayList()

Collection没有索引概念。 ListArrayList有一个可以设置/获取索引的方法。例如,Collectionadd(object)ListArrayListadd(object)add(index, object)