JavaShuo
欄目
標籤
JAVA的主要集合類的數據結構
時間 2019-12-13
標籤
java
主要
集合
數據
結構
欄目
Java
简体版
原文
原文鏈接
集合類的大體分類:List,Map和Set。
數組
1、 List
ArrayList
ArrayList維護着一個對象數組。若是調用new ArrayList()後,它會默認初始一個size=10的數組。
每次add操做都要檢查數組容量,若是不夠,從新設置一個初始容量1.5倍大小的新數組,而後再把每一個元素copy過去。
在數組中間插入或刪除,都要移動後面的全部元素。(使用System.arraycopy())
LindedList
LinkedList的實現是一個雙向鏈表。每一個節點除含有元素外,還包含向前,向後的指針。
新建一個LinkedList,生成一個頭節點(header,就是一個頭指針),它的元素爲null。
它自包含,next和previous指針都指向本身。執行add(Object obj)方法後,會生成一個新節點:
Header節點的next指向鏈表的第一個節點,previous指向鏈表的最後一個節點,在這裏都是first。再增長一個對象,它的形狀像下面這樣:
如今是一個標準的雙向鏈表形狀。每一個節點都有本身的next和previous指針。增長節點,只會對鏈表的指針進行操做,速度快。
LinkedList實現了Deque,因此它有雙向隊列的特徵,在鏈表兩端可增刪數據。使用index查找對象時,會以index和size/2比較,從前或從後向中間搜索。ListIterator可向前或向後迭代。
比較ArrayList和LinkedList的結構,就能夠得出:
(1) ArrayList的remove和add(index, Object)操做代價高,須要移動後面的每一個元素。
(2) LinkedList的get(index)操做代價高,它要先循環遍歷list,找到Object
2、 Map
HashMap
HashMap的結構是一個散列桶,初始化時生成以下結構:
每一個bucket包含一個Entry(map自定義的一種結構,包含一個日後的指針)的鏈表。在put(key, value)後,它的結構以下:
將key的hashcode再次散列,而後用這個hash和length-1進行按位與操做,獲得bucket的index,而後檢查當前bucket的鏈表,有沒有這個key,若是有替換value,沒有則跟在鏈表的最後。
容許key和value均可以是null
Index=0的bucket存key=null的value,也能夠是其它hashcode爲0的項。
初始容量必須爲2的冪次(個人理解是,在生成index的時候有這樣的代碼:hase ^ (length - 1)),length – 1的二進制代碼爲全1,則容易進行hash的設計)。
若是兩個key散列後的index同樣的話,第一個key生成的Entry先存在桶中,第二個key生成的Entry會將第一個Entry設爲本身的next,串起來。(如圖中,先put(yy, 「first」),會將這個Entry設爲bucket的第一項,後put(xx,」second」),則生成新Entry,它的next爲key爲yy的Entry,生成一個鏈表)。
在put操做中,會比較threshold(capacity * load_factor,一個臨界值),若是size > threshold的話,生成一個當前bucket兩倍數量的buckets,而後把現有的數據從新散列到新bucket中。
對HashMap迭代時,返回數據的順序是:index從0到length-1,循環遍歷每一個bucket,把不爲null的數據取出,每一個bucket內的順序由鏈表的順序決定。而不是由插入數據決定。
LinkedHashMap
上面說過,Map的迭代不禁插入順序決定。若是要保持這種順序呢?就要新增長一種結構來保持。
LinkedHashMap是HashMap的子類,增長一個雙向鏈表,用來存儲每一個新加入的節點。在遍歷時,按鏈表的順序進行。其實差很少就是上面HashMap和LinkedList的和吧。
3、Set
HashSet
HashSet使用HashMap來保持元素。Key = 元素,value是一個公有的對象,對每一個元素都同樣,在HashMap裏面key是唯一的,固然很適合於構造set集合。等同於用HashMap包裝了次,顯示Set本身的特性。
最後還要提到集合類裏面一個很重要的類:Collections,它有不少本身獨特的靜態方法。固然它主要提供幾種特殊集合(List, Map,Set),能夠調用靜態方法來得到:Unmodifiable
(不可修改集合,不可添加或刪除元素),Synchronize
(保持同步集合,它的基本每一個方法都加鎖,防止併發操做),Checked
(聲明之始傳入特定類型,之後的操做都會驗證加入元素是否屬於已定類型),Singleton
(集合中只包含一個元素)。它們都是經過包裝集合類中的抽象類得到,產生不一樣的行爲。
相關文章
1.
java主要集合類的數據結構學習
2.
Java:集合類的數據結構
3.
Java集合類的數據結構(一)
4.
Java集合類及其數據結構
5.
Java集合類結構
6.
JAVA總結(數據結構--集合)
7.
Java數據結構與算法之數據結構-邏輯結構-集合(二)------集合類分述圖描述
8.
主要集合類和主要映射類總結
9.
java集合類的繼承結構
10.
java基礎--5.集合-3.集合中的數據結構
更多相關文章...
•
Redis和數據庫的結合
-
Redis教程
•
Redis集合數據結構和常用命令
-
Redis教程
•
TiDB 在摩拜單車在線數據業務的應用和實踐
•
Flink 數據傳輸及反壓詳解
相關標籤/搜索
java集合類
數據結構+Java
java數據結構
數據集合
數據結構
java集合總結
集合類型的併發
數據結構題集
數據結構02
C++數據結構
快樂工作
Java
NoSQL教程
Redis教程
MyBatis教程
數據傳輸
數據庫
數據業務
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
resiprocate 之repro使用
2.
Ubuntu配置Github並且新建倉庫push代碼,從已有倉庫clone代碼,並且push
3.
設計模式9——模板方法模式
4.
avue crud form組件的快速配置使用方法詳細講解
5.
python基礎B
6.
從零開始···將工程上傳到github
7.
Eclipse插件篇
8.
Oracle網絡服務 獨立監聽的配置
9.
php7 fmp模式
10.
第5章 Linux文件及目錄管理命令基礎
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
java主要集合類的數據結構學習
2.
Java:集合類的數據結構
3.
Java集合類的數據結構(一)
4.
Java集合類及其數據結構
5.
Java集合類結構
6.
JAVA總結(數據結構--集合)
7.
Java數據結構與算法之數據結構-邏輯結構-集合(二)------集合類分述圖描述
8.
主要集合類和主要映射類總結
9.
java集合類的繼承結構
10.
java基礎--5.集合-3.集合中的數據結構
>>更多相關文章<<