1. 程式人生 > >Java集合框架學習(一)List

Java集合框架學習(一)List

collect 有序集合 original package images 遍歷 容量 exp 子類

先附一張Java集合框架圖。

技術分享

從上面的集合框架圖可以看到,Java集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射。Collection接口又有3種子類型,List、Set和Queue,再下面是一些抽象類,最後是具體實現類,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等。(ps:帶虛線邊框的都是接口不能直接使用)

Collection接口

Collection接口是處理對象集合的根接口,其中定義了很多對元素進行操作的方法,AbstractCollection是提供Collection部分實現的抽象類。下圖展示了Collection接口中的全部方法。

技術分享
Collection接口結構

其中,有幾個比較常用的方法,比如方法add()添加一個元素到集合中,addAll()將指定集合中的所有元素添加到集合中,contains()方法檢測集合中是否包含指定的元素,toArray()方法返回一個表示集合的數組。Collection接口有三個子接口,下面詳細介紹。

1.List

List接口擴展自Collection,它可以定義一個允許重復的有序集合,從List接口中的方法來看,List接口主要是增加了面向位置的操作,允許在指定位置上操作元素,同時增加了一個能夠雙向遍歷線性表的新列表叠代器ListIterator。AbstractList類提供了List接口的部分實現,AbstractSequentialList擴展自AbstractList,主要是提供對鏈表的支持。下面介紹List接口的兩個重要的具體實現類,也是我們可能最常用的類,ArrayList和LinkedList。

ArrayList

通過閱讀ArrayList的源碼,我們可以很清楚地看到裏面的邏輯,它是用數組存儲元素的,這個數組可以動態創建,如果元素個數超過了數組的容量,那麽就創建一個更大的新數組,並將當前數組中的所有元素都復制到新數組中。假設第一次是集合沒有任何元素,下面以插入一個元素為例看看源碼的實現。

1、方法add(E e)向集合中添加指定元素。
1 public boolean add(E e) {
2         ensureCapacityInternal(size + 1);  // Increments modCount!!
3         elementData[size++] = e;
4 return true; 5 }

2、此方法主要是確定將要創建的數組大小。
 1 private void ensureCapacityInternal(int minCapacity) {
 2         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
 3             minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
 4         }
 5 
 6         ensureExplicitCapacity(minCapacity);
 7     }
 8 
 9     private void ensureExplicitCapacity(int minCapacity) {
10         modCount++;
11         if (minCapacity - elementData.length > 0)
12             grow(minCapacity);
13     }

3、最後是創建數組,可以明顯的看到先是確定了添加元素後的大小之後將元素復制到新數組中。
 1 private void grow(int minCapacity) {
 2         // overflow-conscious code
 3         int oldCapacity = elementData.length;
 4         int newCapacity = oldCapacity + (oldCapacity >> 1);
 5         if (newCapacity - minCapacity < 0)
 6             newCapacity = minCapacity;
 7         if (newCapacity - MAX_ARRAY_SIZE > 0)
 8             newCapacity = hugeCapacity(minCapacity);
 9         // minCapacity is usually close to size, so this is a win:
10         elementData = Arrays.copyOf(elementData, newCapacity);
11     }

LinkedList

同樣,我們打開LinkedList的源文件,不難看到LinkedList是在一個鏈表中存儲元素。

在學習數據結構的時候,我們知道鏈表和數組的最大區別在於它們對元素的存儲方式的不同導致它們在對數據進行不同操作時的效率不同,同樣,ArrayList與LinkedList也是如此,實際使用中我們需要根據特定的需求選用合適的類,如果除了在末尾外不能在其他位置插入或者刪除元素,那麽ArrayList效率更高,如果需要經常插入或者刪除元素,就選擇LinkedList。

Vector

用法上,Vector與ArrayList基本一致,不同之處在於Vector使用了關鍵字synchronized將訪問和修改向量的方法都變成同步的了,所以對於不需要同步的應用程序來說,類ArrayList比類Vector更高效。(synchronized關鍵字詳解

參考:

http://www.jianshu.com/p/63e76826e852

Java集合框架學習(一)List