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

Bha*_*esh 3 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

何时何地使用ArrayList,Collection和List?在哪些特定情况下,它们之间的差异可能是显着的?

Dav*_*ton 10

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

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

ArrayList是一个实现,List并且通常不会在声明中使用,除非您需要实现保证(例如,快速索引访问),但可以用作列表.

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

通常,使用提供所需内容的最少特定接口.例如,传递Collection代替List允许更广泛的实现选择.如果你需要索引访问(例如List.get(int)),Collection那就不行了.

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


Mic*_*rdt 6

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

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

没有仔细思考的API中使用可能会导致很多无谓的转换和不必要的慢代码的类型,集合之间的转换Collection,Set,List和各种实现类只是为了满足设计很差的API.