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.
Mud Puddles ( bfs )
2.
ReSIProcate環境搭建
3.
SNAT(IP段)和配置網絡服務、網絡會話
4.
第8章 Linux文件類型及查找命令實踐
5.
AIO介紹(八)
6.
中年轉行互聯網,原動力、計劃、行動(中)
7.
詳解如何讓自己的網站/APP/應用支持IPV6訪問,從域名解析配置到服務器配置詳細步驟完整。
8.
PHP 5 構建系統
9.
不看後悔系列!Rocket MQ 使用排查指南(附網盤鏈接)
10.
如何簡單創建虛擬機(CentoOS 6.10)
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
java主要集合類的數據結構學習
2.
Java:集合類的數據結構
3.
Java集合類的數據結構(一)
4.
Java集合類及其數據結構
5.
Java集合類結構
6.
JAVA總結(數據結構--集合)
7.
Java數據結構與算法之數據結構-邏輯結構-集合(二)------集合類分述圖描述
8.
主要集合類和主要映射類總結
9.
java集合類的繼承結構
10.
java基礎--5.集合-3.集合中的數據結構
>>更多相關文章<<