List的徒子徒孫們

1. 徒子徒孫報道java

        從 Collection家族成員 中能夠知道List的徒子徒孫們有(綠色爲實現,橙色爲繼承):數組

AbstractList :     SubList :    RandomAccessSubList安全

                            AbstractSequentialList:    LinkedListdom

                            ArrayList性能

                            Vector : Stackthis

ArrayListspa

LinkedList線程

Vector:    Stackcode

問題:從這些關係裏很明顯發現AbstractList已經實現了List接口,而ArrayList和Vector是繼承它的,爲何ArrayList和Vector還實現List接口?對象

2. AbstractCollection、AbstractList兩個抽象類的功能

AbstractCollection:實現了移除指定元素返回boolean值的功能(依靠迭代器實現的,但此類並未實現迭代器的功能);判斷集合包含元素功能;轉化成數組的功能。

AbstractList:只實現了迭代器功能,繼承AbstractCollection實現的功能。

總結:(1) 這兩個抽象類都未實現元素的添加操做,但卻定義了各類用到add的方法,算是搭了骨架,只要後面的徒子徒孫們實現add操做,remove操做便可融匯貫通。

(2) 集合的接口和抽象類都未見存儲元素的容器(說明這個容器的結構是不肯定的),而是放在具體子類去實現。因此,接口和抽象類都沒法去直接作元素的添加和移除功能(由於沒有容器)。至於上面所說的移除指定元素返回boolean值得功能則是依靠迭代器的方法實現。

(3) 回到1裏面提到的問題:a.抽象類是很低級的,它能夠」紙上談兵「,抽象類就抽了同類的共性,在這裏,全部的繼承AbstractCollection的集合類,都會涉及到移除指定元素的操做,爲了能重複利用經過迭代器去移除元素的代碼,因此在頂級抽象類AbstractCollection中實現了,那麼它的子類將無需在現實,這是通用功能。b. 至於子類爲何還去實現父類的實現的接口,我表示徹底能夠不去實現,惟一的好處就是一目瞭然,知道子類實現了某接口,而不要進入父類裏面查看。如果有人發現還有深層妙處,請告知,感激涕零!

3. ArrayList細節

(1) ArrayList的元素容器是數組,經過new ArrayList()建立對象時,數組爲空,當有第一個元素添加時,立刻對數組進行擴容,數組長度變成10。建議:如果事先知道集合元素個數,最好的方法是直接使用對象數組或者new ArrayList(count)。若明確知道集合不爲空,又不知元素個數,則new ArrayList(10)。固然ArrayList有個收縮的方法:trimToSize(),該方法就是去除數組未使用的位置(相似於字符串去除結尾的空字符String::trim())。

(2) ArrayList的擴容機制: 第一次添加元素時,上面說了,就是擴容到10。以後的擴容是,當前數組大小加上當前數組大小的一半。擴容是要付出代價的,會新建一個數組,將原數組的元素的複製到新數組中。

(3) ArrayList的內存釋放: clear()方法,裏面遍歷數組,將元素置null。

(4) ArrayList實現了序列化接口,可是定義的數組對象是transient,說明它不在序列化以內。

4. Vector 和 Stack細節

(1) Vector的元素容器也是數組, 經過new Vector()建立對象,數組默認大小爲10。它能夠自定義定義數組的初始大小和擴容大小。

(2) Vector的數組對象是可被序列化的。

(3) Vector的添加、獲取、移除元素的方法都加了synchronized。說明Vector操做都是線程安全的,一樣這也是耗性能的對象。

(4) Stack 棧對象,後進先出,初始化時,數組爲空。

5. LinkedList細節

(1) LinkedList的元素容器的結構:一個鏈表。下面是鏈表的節點類的源碼。

private static class Node<E> {
  E item;               // 數據
  Node<E> next;         // 下一個節點
  Node<E> prev;         // 上一個節點

  Node(Node<E> prev, E element, Node<E> next) {
     this.item = element;
     this.next = next;
     this.prev = prev;
  }
}

鏈表結構可以快速的任意位置的插入元素,刪除元素,可是鏈表的元素遍歷速度沒有數組快(存儲結構差別決定,數組是連續的內存,鏈表是分散的內存,要找到某個元素,那麼鏈表確定比數組複雜,數組只需寄存器++,而鏈表須要寄存器從新賦值)。

(2) LinkedList雖然實現了序列化接口,可是它裏面的成員都不在序列化範圍內。

相關文章
相關標籤/搜索