java中關於散列表的詳細介紹
什麼是散列表
散列表,也叫作雜湊表(Hash Table),是一種提供鍵(Key)和值(Value)的映射關係的資料結構,只要給出一個Key,就可以高效查找到它所匹配的Value,時間複雜度接近O(1)。
線上學習影片推薦:java影片
#散列表的工作原理
#散列表在本質上是一個陣列。我們知道數組可以根據下標來進行隨機訪問,如a[0], a[1], a[2], a[3], a[4],透過這樣來訪問,因此其查詢效率非常高。而在散列表中,當我們給一個key的時候,也能立即查詢到對應的value。這時我們就需要一個“中繼站”,透過某種方式,把Key和數組下標進行轉換,而這個中繼站就是雜湊函數。
在不同的語言中,雜湊函數的實作方式是不同的。 Java中使用的是HashMap
。
在Java及大多數的物件導向的語言中,每個物件都有屬於自己的hashcode
,用來區分不同的對象,而這個hashcode是一個整形變數。此時我們就需要將這個整形變數轉換成陣列的下標,最簡單的轉換方式就是對陣列長度進行取模。
公式如下:
index = HashCode(key) % Array.length
舉例:
給出一個長度為8的數組,我們要找key為"001121"所對應的Vaule,而" 001121"的hashcode為1420036703,那麼就可透過下面的計算先得到陣列下標:
index = HashCode("001121")%Array.length = 1420036703 % 8 = 7
散列表的讀寫操作
1.寫入操作
寫入操作就是在散列表中插入新的鍵值對(jdk中稱為Entry)。
具體的做法是:透過雜湊函數將key值轉換為陣列下標,然後在陣列的該位置插入Entry(注意是Entry鍵值對Key Value,而不僅僅是Value)。可想而知,不同的key值可能會轉化為相同的下標,那麼此時就成為哈希衝突。
解決雜湊衝突常用的方法是開放尋址法和鍊錶法。
開放尋址法的基本想法是:當發生雜湊衝突時,就把Entry放到下一個陣列中為空的位置,也就是逐一往後移動。
鍊錶法(應用在Java的HashMap集合類別中)的基本思想是:陣列中的每個元素不僅是一個Entry對象,同時也是一個鍊錶的頭節點。每個Entry物件透過next指標指向它的下一個Entry節點。當新來的Entry物件映射到與之衝突的陣列位置時,只需要插入對應的鍊錶中即可。
2.讀取操作
讀取操作與寫入操作對應 ,只需特別處理衝突情況即可。
具體的想法為:透過雜湊函數,將待查找的Key值轉換為數組下標,然後檢查數組中該位置的Key值是否為我們要找的Key,若是,則找到,可以回傳該Entry的Value值;否則,沿著鍊錶繼續往下找,看有沒有對應的Key值。
例如,我們要找Key為002936所對應的value時,先將Key轉換為陣列下標,得到下標為2,檢查該元素,發現該元素的Key為002947,不是我們想要查詢的Key,那麼繼續沿著鍊錶往下找。
3.擴容
我們知道陣列擴容,是當陣列中的元素個數達到陣列的最大長度時需要對數組擴容,那麼散列表什麼時候擴容呢?
當經過多次元素插入,散列表達到一定的飽和度時,發生哈希衝突的機率會變大,此時大量的元素擁擠在相同的數組下標位置,這對後序的插入和查詢操作的效能產生很大的影響,此時就需要對散列表擴充。
影響散列表擴充的因素為:
#Capacity,即HashMap的当前长度
LoadFactor,即HashMap的负载因子,默认值为0.75
扩容需要满足的条件:
HashMap.Size >= Capacity X LoadFactor
简单解释为:当哈希表中的条目数超出了当前容量与其加载因子的乘积时,并且要存放的位置已经有元素了(哈希碰撞),这两个条件满足时,需要进项扩容,会将容量扩大为原来的两倍。加载因子默认值0.75,是在空间和时间上的一个折中,加载因子过高(发生冲突可多存放在链表),虽然减少了空间成本,但也增加了查询成本。
扩容的步骤:
扩容不是简单地把散列表的长度扩大,而是经历了下面两个步骤:
1.扩容,创建一个新的Entry空数组,长度时原数组的2倍;
2.重新Hash,遍历原Entry数组,所有的Entry重新Hash到新数组中。
经过扩容,原本拥挤的散列表重新变得稀疏,原有的Entry也重新得到了尽可能均匀的分配。需要注意的是,关于HashMap的实现,JDK8和以前的版本有着很大的不同。当多个Entry被Hash到同一个数组下标位置时,为了提高插入和查找的效率,HashMap会把Entry的链表转化为红黑树这种数据结构。
相关文章教程推荐:java语言入门
以上是java中關於散列表的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
