2011-11-06 118 views
1

Java中的ArrayList,List和Collection的行爲幾乎相同,它們有許多共同的方法。如果是這樣的話,那麼它們之間的主要區別是什麼?以下簡單的代碼片段演示了它。Java中的Collection,ArrayList和List之間的主要區別是什麼?

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,集合和一個列表?在哪些具體情況下,它們之間的差異可能是顯着的?

+3

也許他知道這麼多,他認爲這個問題沒有用處......不要因爲個人問題而變得個人化。無論如何,你的問題可能可以通過其他幾個問題來回答,例如[Java中Collection和List有什麼區別?](http://stackoverflow.com/questions/3317381/what-is-the-difference-在收集和列表中的java)和[什麼是列表與數組列表?](http://stackoverflow.com/questions/6867484/java-what-is-a-list-vs-an -數組列表)。 –

回答

10

A Collection是定義共享收集行爲的最高級別的接口,並且擴展了Iterable(它僅定義了iterator()方法)。

A List是定義最高級別的共享List行爲的接口。

ArrayList實施List和一般不會在聲明被使用,除非你需要一個實現保障(例如,快速索引訪問),但細如列表值使用

閱讀文檔以查看它們在API中描述的差異–。實現(ArrayList)將爲其實現的每個接口中的每個方法都實現一個類型特定的實現。

一般來說,使用至少特定的接口,提供您所需要的。例如,通過Collection而不是List可以實現更多的選擇。如果您需要索引訪問(例如,List.get(int)),Collection不起作用。

與大多數情況一樣,使用哪種物品完全取決於您的需求。

+0

解釋downvote。 –

2

在所有3種情況下,您正在使用ArrayList。 爲了進一步解釋,Collection<String> collection=new ArrayList<String>();可以重新寫爲,

Collection<String> collection; 
collection = new ArrayList<String>(); 

第一個語句定義了一個名爲collectionCollection<String>類型的變量,而第二條語句創建一個new ArrayList<String>()並將其分配到collection

編譯器允許分配的ArrayList<String>Collection<String>因爲ArrayListis-aCollection即所有的ArrayList是收藏,因爲它們實現了Collectioninterface。反過來顯然不是真的,所有集合絕對不是ArrayLists。

6

對於局部變量,它並不重要。的確很重要,當類型是API,即在方法簽名可能由代碼調用沒有寫的一部分:

  • 類型Collection有一個非常簡單的合同 - 這意味着基本上只有你有一個可以添加和移除元素,檢查集合是否包含特定元素,並遍歷它們。如果這就是您的所有代碼需求,請使用Collection - 它爲使用您的API的代碼提供了最大的自由度。
  • 類型List在其合約中有一個訂單,除了通過明確的操作,您可以get()第n個元素,add()將新元素放在最後等等,如果您的代碼取決於在任何這些特性,你應該使用List
  • ArrayList只是一個具體實施List和不應該的API中使用。它的使用應該只是一個實現細節(除非你有一些非常具體的要求)。

沒仔細思考的API中使用可能會導致很多無謂的轉換和不必要的慢的代碼類型,集合轉換CollectionSetList和各種實現類之間只是爲了滿足設計很差的API。

1

CollectionList是接口。 ArrayList是一類。我們不能new Collection()new List()。但我們可以new ArrayList()

Collection沒有索引的概念。 ListArrayList有一個方法可以設置/使用索引。例如,Collectionadd(object)ListArrayList具有add(object)add(index, object)

相關問題