Java_集合—List

集合篇:

Java_Collection_集合

Java_集合—Collection和Iterator

Java_集合—List

Java_集合—Set

Java_集合—Map

Java_集合的工具類—Collections


List 是 Colllection 的直接子類,它是有序的,它能夠準確的確定每個元素的具體位置,可以直接的通過索引獲取元素。Collection 有迭代器 Iterator ,List也相應的有一個自己Iterator,那就是ListIterator,它也是繼承自Iterator的。其次List和其他集合不同的是:List裏面的元素是可以重複的,而Set的元素是不重複的,Map裏面的Key也是不重複的。

下面來看看List都提供的那些方法,

直接跳過Clooection已有的,直接看看LIst特有的一些方法:


從上面這個代碼中可以看到,List特有的方法中,幾乎都是帶有索引的,因爲List是有序的,所以,集合中,帶有索引的方法中,幾乎都是List 特有的。

現在再來看看List 集合特有的Iterator-->ListIterator,ListIterator就不再上代碼了。ListIterator 和 Iterator 基本相同,不同之處在於,ListIterator有一個hasNext() 方法相對應的,那就是hasPrevious()爲什麼Iterator沒有,而ListIterator是有的,因爲List是有序的。除了這個方法以外,還有兩個特有的,nextIndex()  和 previousIndex(),這兩個方法,一看方法名就一目瞭然了。


List最基本的已經說完就說說它實現的已知子類:ArrayList,LinkedList 和 Vector

ArrayList 底層的數據結構是數組,特點是查詢快,增刪慢。同時線程是異步的,也就是不安全的

LinkedList 底層的數據結構是鏈表,特點是查詢慢,增刪快。同時線程是異步的,也就是不安全的

Vector 底層的數據結構也是數組,線程是同步的,不管增刪還是查詢都比較慢。


瞭解完最基本的區別,現在來看看

ArrayList的底層的數據結構是數組,數組是定長的啊,所以,如果沒有在初始化的時候指定ArrayList的長度,那麼就會自動生成一個長度爲10的數組,當添加第11個數據的時候,ArrayList會自動擴容。一次擴容50%,擴容的方式是在內存中先申請一個現有集合長度的150%長度的數組,然後把原來的數據複製到新的數組中,再銷燬原數組。原理清楚了,ArrayList  的兩個特點也就很好理解了,查詢快,因爲是數組,數組是直接根據索引進行查數據的(數組是申請一片內存,只要知道索引和每一個數據的大小,就能夠算出相應的內存中的地址),所以ArrayList 查詢速度快也就很好理解了,爲什麼增刪會慢呢?也是因爲它底層是數組,假如一個集合的長度是6,那麼我現在要往第三位插入一個數據,那麼,3456這三個是不是要依次往後挪,先把6往後挪一位,也就是7,然後是5,然後是4,最後是3,3移完後,3這個位置纔會騰出來給新的數據插進去。刪除也一樣,例如我要刪第3個數據,那麼,就把3刪掉後,456都要往前挪,所以,ArrayList在增加和刪除的時候是比較耗時間的,需要移動的數據太多了。如果遇到不夠大的時候,需要擴容,那就更慢了。最後說說,ArrayList 還有一個缺點是:會浪費內存,因爲是數組,數組是定長的,如果沒有用完,還有空缺的,那就浪費了。


LinkedList 的底層的數據結構是鏈表。鏈表就是一個一個節點組成的,節點除了存儲數據以外,還存儲着它上一個節點的地址和下一個節點的地址。這就是鏈表。鏈表爲什麼增刪快呢?因爲鏈表在增刪的時候數據是不需要移動的,原來在哪就在哪?在內存中的位置是不變的,變得只是它存儲的上一個節點的地址或者下一個節點的地址。假設現在有AB兩個節點,A節點在前,B節點在後,那麼,A節點的下一個節點的地址存儲的是B節點的地址,B節點的上一個節點的地址存儲的是A節點的地址,現在要往AB節點中間插入一個節點C,那麼C節點插入的時候只需要把C節點的上一個節點的地址爲A的地址,下一個的地址爲B的地址,然後把A下一個的地址改爲C的地址,B的上一個的地址改爲C的地址,不用挪動數據,只需要改節點的地址就可以,相應的,刪除也一樣,刪除只需要把要刪除的節點的前一個節點和後一個的相應的地址就可以,例如有ABC三個節點,要刪除B節點,只需要把A節點的下一個節點的地址改成C節點的地址,把C節點的上一個節點的地址改成A節點的地址。所以,鏈表的增刪是比較快的,而爲什麼查找會比較慢呢?前面已經說過ArrayList的數據結構是數組,根據索引就可以算出相應元素存儲的位置,而鏈表不一樣,如果你需要找底3個節點,那麼你就需要先通過第一個節點找到第二個節點,然後通過第二個節點找到第三個節點,所以,如過LinkedList在查找的時候,越靠後的查找越慢,(如果linkedList是從後面往前找的話就反過來)。


最後就是Vector,它和ArrayList的底層實現是一樣的,最大的不同就是它是線程同步的,是安全的。同時也是因爲線程同步,所以,它無論增刪還是查找都是比較慢的。





發佈了38 篇原創文章 · 獲贊 25 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章