1. 程式人生 > >java基礎-集合底層原理分析

java基礎-集合底層原理分析

java集合框架主要包括兩種型別的集合容器:

一、Collection

儲存一個元素的。它又包含三個子型別:List、Set、Queue

List:可以儲存重複的資料、有序的

List常用的類是ArrayList和LinkedList

ArrayList是基於陣列儲存資料,其原理是當呼叫add()方法,先計算容器的大小,重新new一個新的陣列大小,並將當前的陣列所有元素複製到這個新的陣列中,然後將最新的值放入陣列的最後一個

LinkedList是基於雙向連結串列結構儲存資料,,其原理是連結串列由每一個節點node構成,每一個節點包含前節點資訊、業務資料息以及後節點 資訊;包含兩個指標,一個指標是指向下一個結點的,另一個指標當然就是指向上一個結點的。這樣的連結串列就可以通過第一個結點找到最後一個結點,當然也可以通過最後一個結點找到第一個結點,所以它是雙向的


Set:儲存的資料不能重複,無序的

Set有三個比較常用的類是雜湊集HashSet、鏈式雜湊集LinkedHashSet和樹形集TreeSet

HashSet實現原理:Set底層實際上是一個HashMap,由於HashMap的put()方法是一個鍵值對,當新放入HashMap的Entry中key 與集合中原有Entry的key相同(hashCode()返回值相等,通過equals比較也返回true),新新增的Entry的value會將覆蓋原來Entry的value,但key不會有任何改變。因此如果向HashSet中新增一個已經存在的元素時,新新增的集合元素將不會被放入HashMap中,原來的元素也不會有任何改變,這也就滿足了Set中元素不重複的特性。 

LinkedHashSet實現原理:LinkedHashSet底層實際上是一個LinkedHashMap 

Queue:是一種特殊的線性表,它只允許在對頭進行刪除操作,在對尾進行新增操作。採用“先進先出”的原則進行操作

add 增加一個元索  如果佇列已滿,則丟擲一個IIIegaISlabEepeplian異常
remove移除並返回佇列頭部的元素  如果佇列為空,則丟擲一個NoSuchElementException異常
element  返回佇列頭部的元素  如果佇列為空,則丟擲一個NoSuchElementException異常
offer新增一個元素並返回true 如果佇列已滿,則返回false
poll移除並返問佇列頭部的元素 如果佇列為空,則返回null
peek 返回佇列頭部的元素  如果佇列為空,則返回null
put 新增一個元素  如果佇列滿,則阻塞
take移除並返回佇列頭部的元素  如果佇列為空,則阻塞

二、Map

儲存鍵值對對映;常用的有三個子類:HashMap、LinkedHashMap以及TreeMap

HashMap實現原理:是基於雜湊表實現的,是一個“連結串列雜湊”的資料結構,即陣列和連結串列的結合體。首先,HashMap類的屬性中定義了Entry型別的陣列。Entry類實現java.ultil.Map.Entry介面,同時每一對key和value是作為Entry類的屬性被包裝在Entry的類中。

hashmap實際上是一個數組+連結串列的資料結構,hashmap底層是一個數組結構,陣列中每一項又是一個連結串列結構。連結串列是為了解決hash衝突。

如圖所示,HashMap的資料結構:


可以看出,HashMap底層就是一個數組結構,陣列中的每一項又是一個連結串列。當新建一個HashMap的時候,就會初始化一個數組。table陣列的元素是Entry型別的。每個 Entry元素其實就是一個key-value對,並且它持有一個指向下一個 Entry元素的引用,這就說明table陣列的每個Entry元素同時也作為某個Entry連結串列的首節點,指向了該連結串列的下一個Entry元素,這就是所謂的“連結串列雜湊”資料結構,即陣列和連結串列的結合體。

關於hashCode作用:

在集合中,每次新增一個新的元素的時候都要判斷該元素是否重複,判斷一個元素是否重複採用的是Object.equal()方法,這就造成一個如果一個集合裡面本來就有10000個元素,如果新增一個新的元素進去就要進行10000次的比對,這樣效能非常低下。於是java就採用雜湊表的原理,雜湊演算法也稱為雜湊演算法。當新增一個新的元素時,將物件使用hash演算法獲得hash值,然後將hash值和集合長度進行&操作,獲得該元素在陣列中所存放的索引。如果這個元素上沒有元素就直接將該元素存放在這裡。如果該元素上有值,就呼叫equal值進行比對,如果相同就不存入,如果不相同就表示發生衝突了,散列表對於衝突有具體的解決辦法,但最終還會將新元素儲存在適當的位置。

這樣一來,實際呼叫equals方法比較的次數就大大降低了,幾乎只需要一兩次。

Java物件的eqauls方法和hashCode方法是這樣規定的:
1、相等(相同)的物件必須具有相等的雜湊碼(或者雜湊碼)。
2、如果兩個物件的hashCode相同,它們並不一定相同。

LinkedHashMap:LinkedHashMap是HashMap的子類,實現結構和HashMap類似,只是HashMap中的連結串列是單向連結串列,而LinkedHashMap是雙向連結串列,只是在在HashMap的基礎上加上了排序實現。

TreeMap底層採用打的紅黑樹演算法

相關推薦

java基礎-集合底層原理分析

java集合框架主要包括兩種型別的集合容器:一、Collection儲存一個元素的。它又包含三個子型別:List、Set、QueueList:可以儲存重複的資料、有序的List常用的類是ArrayLis

Java基礎之HashMap原理分析(put、get、resize)

在分析HashMap之前,先看下圖,理解一下HashMap的結構 ![圖片](https://images.cnblogs.com/cnblogs_com/kezhuang/1846266/o_200912094424企業微信20200912054321.png) 我手畫了一個圖,簡單描述一下HashMa

Java集合---ConcurrentHashMap原理分析

背景 執行緒不安全的HashMap 因為多執行緒環境下,使用Hashmap進行put操作會引起死迴圈,導致CPU利用率接近100%,所以在併發情況下不能使用HashMap。 效率低下的HashTable容器 HashTable容器使用synchronized來

Java集合---ConcurrentHashMap原理分析(面試問題:ConcurrentHashMap實現原理是怎麼樣的)

集合是程式設計中最常用的資料結構。而談到併發,幾乎總是離不開集合這類高階資料結構的支援。比如兩個執行緒需要同時訪問一箇中間臨界區(Queue),比如常會用快取作為外部檔案的副本(HashMap)。這篇文章主要分析jdk1.5的3種併發集合型別(concurrent,cop

Java集合---ConcurrentHashMap原理分析(轉)

    轉載自: http://www.cnblogs.com/ITtangtang/p/3948786.html       感謝作者 集合是程式設計中最常用的資料結構。而談到併發,幾乎總是離不開集合這類高階資料結構的支援。比如兩個執行緒需要同時訪問一箇中間臨

面試題-Java基礎-集合和數組

eset ria design iter 什麽 code zab 索引 鍵值對存儲 1.Java集合類框架的基本接口有哪些? 集合類接口指定了一組叫做元素的對象。集合類接口的每一種具體的實現類都可以選擇以它自己的方式對元素進行保存和排序。有的集合類允許重復的鍵,有些不允

黑馬程序猿——JAVA基礎——集合

安全性 優先 java集合框架 gif map對象 排序 1.2 是否 trac ----------android培訓、java培訓、java學習型技術博客、期待與您交流。------------ 一、關於java中的集合類 首先看一下,大致的

[Java]I/O底層原理之二:Socket工作機制

tcp連接 fin 連接建立 src 並發 如果 send rec 轉換 一、TCP狀態轉化 TCP連接的狀態轉換圖如下 註:SYN 表示建立鏈接、FIN 表示關閉鏈接、ACK 表示響應、PSH 表示有數據傳輸、RST 表示鏈接重置。 CLOSED:初始狀態,在超時或

支付寶app支付java後臺流程及原理分析

system 分析 req eterm 格式 prop 通過 false 由於 java版支付寶app支付流程及原理分析   本實例是基於springmvc框架編寫 一、流程步驟 1.執行流程 當手機端app(就是你公司開發的a

java基礎--集合框架(強弱)

字符 收集 erro sts 軟引用 每一個 框架 bject 缺陷 (1) 隊列:單向和雙向 一、單向:一端操作 1、一般:FIFO 2、優先和堆棧: LIFO 二、雙向:兩端操作,頭或尾操作 package com.zwj.que; import

Java基礎(三)-final關鍵字分析

signed 主題 long java style rri test 引用類型 初始 今天來談談final關鍵字的作用, 雖然有很多博文關於final進行了很深的研究,但還是要去記錄下談談自己的見解加深下印象。下面直接進入主題: 一、final關鍵字的作用   1、被fin

Java 基礎 集合框架

con tar java集合 ava 復雜 www div 哈希表 clas   Java中的集合從類的繼承和接口的實現結構來說,可以分為兩大類:   1 繼承自Collection接口,包含List、Set和Queue等接口和實現類。   2 繼承自Map接口,主要包含哈

java基礎-集合

navig 其他 prior 體系結構 roc atlas ges 需要 -o 2018-1-23 by Atlas 體系結構 Navigable:可導航的,理解成有秩序的。Priority:優先的。其他個人覺得都常用不解釋。拋開算法,Map和Collection

JAVA基礎——集合淺析

div 判斷 要求 ron .info val rowspan adding 雙向鏈表 Java 集合 什麽時候數組會顯得力不從心,沒法滿足需求,需要集合類呢? 不知道具體數據長度 需要自動排序 存儲鍵值對 當然,上面的情況不是絕對的,只是數組比較難滿

Java並發AQS原理分析(一)

jpg 子類 ole success ces || pro 同步 無法 我們說的AQS就是AbstractQueuedSynchronizer,他在java.util.concurrent.locks包下,這個類是Java並發的一個核心類。第一次知道有這個類是在看可重入鎖R

HashMap底層原理分析(put、get方法)

return sta rec oca ati 技術分享 AI TP load 1、HashMap底層原理分析(put、get方法) HashMap底層是通過數組加鏈表的結構來實現的。HashMap通過計算key的hashCode來計算hash值,只要hashCode一樣

day29 基於TCP協議通信的簡單套接字/加上通信循環/加上連接循環/套接字通信底層原理分析

穩定 一個 原理分析 響應 介質 底層原理 固定 -s tcp 上節課復習 1、C/S B/S   client------serve   browser-----serve   其中服務端必須具備:   1、穩定運行,對外一直提供服務   2、綁定一個固定的IP+por

Java原子類實現原理分析

upd hat 16px 檢查 () 過程 jvm api 處理 並發包中的原子類可以解決類似num++這樣的復合類操作的原子性問題,相比鎖機制,使用原子類更精巧輕量,性能開銷更小,下面就一起來分析下原子類的實現機理。 悲觀的解決方案(阻塞同步)   我們知道,num++看

JAVA基礎——集合——ArrayList

bject index pre ext contains element one rem boolean ArrayList集合 ArrayList的一些方法(JDK1.8): 將指定的元素附加到列表的末尾,true:添加成功,false:添加失敗: public bool

java基礎--集合框架的認識

一、集合框架        對於不知道儲存數量和更復雜的方式儲存物件用集合框架。        其中有幾個常用的介面和實現類:Collection父介面、List介面,Set介面,Map介面,     &