1. 程式人生 > >集合相關的底層實現學習

集合相關的底層實現學習

java集合使用還是很廣泛的,而且面試的時候也會經常問到,是否有序,是否執行緒安全以及底層實現的原理等等,這兩天看一下jdk的底層,還是對自己更進一步瞭解集合實現由很大的好處。
由於程式碼較多,主要檢視一下例項化方法,新增元素方法,移除元素方法,以及儲存方式來對比各種集合的實現的區別以及聯絡。

1. ArrayList

例項化方法
初始化方法
初始化的時候會建立一個初始化長度為10的陣列。
新增元素方法
新增
新增指定的元素到陣列的末尾,返回值是TRUE,直接放到陣列中儲存
移除元素方法
移除方法
如果是整數型別,刪除的是索引對應的資料,如果是直接刪除obj,則會只刪除一個匹配的obj,不會刪除所有的。
例子


儲存方式
儲存
從原始碼可以看到ArrayList是通過Object[]陣列來儲存資料的

2. LinkedList

例項化方法
LinkedList的例項化沒有什麼特殊的地方。就是直接的例項化,但是其內部的儲存是有一個size記錄陣列的長度,需要記錄其最前的一個元素和最後的一個元素。其內部定義了一個類Node,記錄的當前元素,前一個元素和後一個元素。
新增元素方法
新增方法
預設的新增方法是新增到末尾,也可以在某個元素之前之後新增,都是通過修改前後指標來完成的
移除元素方法
移除方法
移除方法也是通過修改前後指標實現的,如果有重複的,也是隻刪除第一個符合條件的元素
儲存方式
LinkedList是使用連結串列儲存資料的,分配的記憶體空間不必是連續的,刪除,新增元素的速度很快,只需要修改前後指標,但是遍歷元素較慢,需要從第一個元素開始遍歷

3. Vector

例項化方法
例項化
直接初始化的話,預設長度也是10,與ArrayList一樣,也是通過Object[]陣列儲存的。
新增元素方法
新增元素
方法與ArrayList類似,但是其有同步關鍵字,是執行緒安全的。
移除元素方法
移除元素
重點還是執行緒安全的
儲存方式
通過Object[]陣列實現的儲存

4. HashMap

例項化方法
例項化
其預設長度是16,
新增元素方法
新增方法
key是不能重複的,儲存是根據key的hash存放,所以是無序的
移除元素方法
這裡寫圖片描述
通過key移除元素
儲存方式
儲存
儲存是通過一個Node[]陣列儲存的。Node是其內部的一個類,定義了一個hash,key還有value,以及記錄下一個元素。HashMap的資料結構是table[Entry],entry是一個連結串列結構,資料的每一個元素是一個連結串列,不同的key但是有hashCode會落在table[hashCode]的連結串列上,當使用Iterator遍歷時,使用的是table[entry]連結串列的順序,而不是插入順序。

5. HashTable

例項化方法
這裡寫圖片描述
例項化方法與HashMap類似,但是預設長度是11
新增元素方法
新增
新增方法與hashMap類似,只是命名不一樣。其實Entry,其方法是執行緒安全的
移除元素方法
移除
移除之後所有的,元素會重新排列
儲存方式
也是通過連結串列儲存的。但是是執行緒安全的一個類

6. LinkedHashMap

實體
LinkedHashMap繼承了HashMap,但是內部維持了一個雙向連結串列,可以保持順序,其Entry繼承HashMap 的Node,多出了前後Entry前後元素的儲存,保證其順序性,相比HashMap,其保持了順序,者應該是最大的優點,其他方法大多都是呼叫其父類的

7. TreeMap

TreeMap是一個有序的key-value集合,他是通過紅黑二叉樹實現的,它的儲存也是基於二叉樹儲存的,非執行緒安全,其內部的Entry是K,V,left,right,parent,和color組成,新增修改元素主要通過左旋右旋實現
treeMap

8. HashSet

內部通過HashMap實現,由於HashMap的put方法新增k-y時,當新元素放入HashMap的Entry中,key與集合中原有的Entry的key相同(hashCode返回相等且equals返回true)新新增的Entry的value將會覆蓋原來的Entry的value。但是key不會有任何的改變,因此如果向HashSet新增一個已經存在的元素時,新新增的元素則不會放入HashMap中,原來的元素不會有任何改變,這也就滿足了set中元素不重複的特性,所有的元素value都是預設的一個new Object().

9. TreeSet

同HashSet類似,TreeSet是通過TreeMap實現的,排列無序,不可重複。

10. LinkedHashSet

LinkedHashSet繼承了HashSet,根本還是HashMap實現的,使用連結串列式儲存。

相關推薦

集合相關底層實現學習

java集合使用還是很廣泛的,而且面試的時候也會經常問到,是否有序,是否執行緒安全以及底層實現的原理等等,這兩天看一下jdk的底層,還是對自己更進一步瞭解集合實現由很大的好處。 由於程式碼較多,主要檢視一下例項化方法,新增元素方法,移除元素方法,以及儲存方式來

Laravel $model->save()的相關底層實現邏輯程式碼

    相信很多人就對這個問題很疑惑:    $model = new Model(); $mdoel->user_name = $userName;$mdoel->save();        

集合底層實現

ArrayList的實現原理:     1.ArrayList是List介面的可變陣列非同步實現,並允許包括null在內的所有元素。     2.底層使用陣列實現。     3.該集合是可變長度陣列,陣列擴容時,會將老陣列中的元素重新拷貝一份到新的陣列中,每次陣列容量增

Java集合 --- HashMap底層實現和原理

概述 文章的內容基於JDK1.7進行分析,之所以選用這個版本,是因為1.8的有些類做了改動,增加了閱讀的難度,雖然是1.7,但是對於1.8做了重大改動的內容,文章也會進行說明。 HashMap基於Map介面實現,元素以鍵值對的方式儲存,並且允許使用null 建和null值,因為ke

synchronized底層實現學習

  上文我們總結了 synchronized 關鍵字的基本用法以及作用,並未涉及 synchronized 底層是如何實現的,所謂刨根問底,本文我們就開始 synchronized 原理的探索之旅吧(*>﹏<*)。   1. 物件鎖是什麼    不同於ReentrantL

Java集合框架底層實現 --原始碼

List: ArrayList 陣列實現 /** * Default initial capacity. */ private static final int

各種集合型別底層實現原理  澤0715…

Set和Map的關係 Set代表無序,不能重複的集合;Map代表Key-Value組成的集合,是一種關聯陣列。Map的Key要求是不能重複,沒有順序。把Map的所有Key組合起來就是Set。Set keySet(); HashMap和HashSet原理 HashMap底層是用陣列連結串列儲存的

17.java中集合底層實現

Collection(List+Set) |--List 有序,可重複   |--ArrayList     底層資料結構是陣列,查詢快,增刪慢。     執行緒不安全,效率高   |--Vector     底層資料結構是陣列,查詢快,增刪慢。     執行緒安全,效

《閒扯Redis十一》Redis 有序集合物件底層實現

## 一、前言 >**Redis** 提供了5種資料型別:String(字串)、Hash(雜湊)、List(列表)、Set(集合)、Zset(有序集合),理解每種資料型別的特點對於redis的開發和運維非常重要。 原文解析 ![Redis五種資料型別][1] **備註:** 本節中涉及到的跳躍表實現,已

【深入學習java集合系列】LinkedHashMap的底層實現

最近寫到LeetCode上的某一題LRUCache。可以採用LinkedHashMap實現,通過重寫removeEldestEntry方法,即可實現。 LinkedHashMap map; public LRUCache(int capacity) {

集合各個實現類的底層實現原理 ----- 原文地址:https://blog.csdn.net/qq_25868207/article/details/55259978

ref rev node 是個 增長 添加 單鏈表 htm edm ArrayList實現原理要點概括 參考文獻: http://zhangshixi.iteye.com/blog/674856l https://www.cnblogs.com/leesf456/p/530

(二)Java集合專題-詳細分析HashtableJDK1.8集合底層實現的思想

(一)詳細分析Hashtable1.8集合底層實現的思路和原始碼 (1)先來看一下Hashtable的結構圖:首先他和HashMap結構都是一樣的,都是由陣列和連結串列進行實現的(在JDK1.8是用陣列和連結串列和紅黑樹的),每一個數組裡面存的是一個Entry節點,節點裡面有Key、

caffe原始碼深入學習6:超級詳細的im2col繪圖解析,分析caffe卷積操作的底層實現

在先前的兩篇部落格中,筆者詳細解析了caffe卷積層的定義與實現,可是在conv_layer.cpp與base_conv_layer.cpp中,卷積操作的實現仍然被隱藏,通過im2col_cpu函式和caffe_cpu_gemm函式(後者實現矩陣乘法)實現,在此篇部落格中,筆者旨在向大家展示,caf

.集合Set,HashSet,TreeSet及其底層實現HashMap和紅黑樹;Collection總結

ONE.Set集合 one.Set集合的特點  無序,唯一 TWO.HashSet集合 1.底層資料結構是雜湊表(是一個元素為連結串列的陣列) 2.那麼HashSet如何來實現元素的唯一性的呢? 通過一HashSet新增字串的案例檢視HashSet中add()的原始碼,

深度學習 | Python下LeNet5的底層實現

前言 加油 參考:https://blog.csdn.net/hjimce/article/details/47323463# 一、匯入MNIST手寫資料集 import _pickle as cPickle import gzip import nu

集合實現類的底層實現原理

ConcurrentHashMap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術。 它使用了多個鎖來控制對hash表的不同段進行的修改,每個段其實就是一個小的hashtable,它們有自己的鎖。只要多個併發發生在不同的段上,它們就可以併發進行。 ConcurrentHashMap在底層將key-val

(一)Java集合專題-詳細分析HashMap集合底層實現的思想

詳細分析HashMap JDK1.8集合底層實現的思想和原理 (1)先來看一下整個Map家族的整體都是怎麼樣的關係 (2)先了解一下HashMap的基本特性: 1.實現了Map介面,裡面的方法全部被H

Redis有序集合(sortSet)的底層實現

Redis中支援的資料結構比Memcached要多,如基本的字串、雜湊表、列表、集合、可排序集,在這些基本資料結構上也提供了針對該資料結構的各種操作,這也是Redis之所以流行起來的一個重要原因,當然Redis能夠流行起來的原因,遠遠不只這一個,如支援高併發的讀寫、資料的

HashMap集合底層實現原理

Java集合:HashMap底層實現和原理(原始碼解析) Note:文章的內容基於JDK1.7進行分析。1.8做的改動文章末尾進行講解。 一、先來熟悉一下我們常用的HashMap: 1、概述 HashMap基於Map介面實現,元素以鍵值對的方式儲存,並且允許使用null 建和null

HashMap底層實現原理(學習筆記)

  看了一上午,原始碼看的頭疼,果斷放棄,放個連結吧 https://www.cnblogs.com/chengxiao/p/6059914.html jdk1.8原始碼解析:https://blog.csdn.net/xp2234/article/details/801