搜尋
首頁Javajava教程java中關於散列表的詳細介紹

java中關於散列表的詳細介紹

Nov 29, 2019 pm 04:23 PM
java散列表

java中關於散列表的詳細介紹

什麼是散列表

散列表,也叫作雜湊表(Hash Table),是一種提供鍵(Key)和值(Value)的映射關係的資料結構,只要給出一個Key,就可以高效查找到它所匹配的Value,時間複雜度接近O(1)。

java中關於散列表的詳細介紹

線上學習影片推薦:java影片

#散列表的工作原理

#散列表在本質上是一個陣列。我們知道數組可以根據下標來進行隨機訪問,如a[0], a[1], a[2], a[3], a[4],透過這樣來訪問,因此其查詢效率非常高。而在散列表中,當我們給一個key的時候,也能立即查詢到對應的value。這時我們就需要一個“中繼站”,透過某種方式,把Key和數組下標進行轉換,而這個中繼站就是雜湊函數。

java中關於散列表的詳細介紹

在不同的語言中,雜湊函數的實作方式是不同的。 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物件映射到與之衝突的陣列位置時,只需要插入對應的鍊錶中即可。

java中關於散列表的詳細介紹

2.讀取操作

讀取操作與寫入操作對應 ,只需特別處理衝突情況即可。

具體的想法為:透過雜湊函數,將待查找的Key值轉換為數組下標,然後檢查數組中該位置的Key值是否為我們要找的Key,若是,則找到,可以回傳該Entry的Value值;否則,沿著鍊錶繼續往下找,看有沒有對應的Key值。

例如,我們要找Key為002936所對應的value時,先將Key轉換為陣列下標,得到下標為2,檢查該元素,發現該元素的Key為002947,不是我們想要查詢的Key,那麼繼續沿著鍊錶往下找。

java中關於散列表的詳細介紹

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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JVM如何處理操作系統API的差異?JVM如何處理操作系統API的差異?Apr 27, 2025 am 12:18 AM

JVM通過JavaNativeInterface(JNI)和Java標準庫處理操作系統API差異:1.JNI允許Java代碼調用本地代碼,直接與操作系統API交互。 2.Java標準庫提供統一API,內部映射到不同操作系統API,確保代碼跨平台運行。

Java 9影響平台獨立性中引入的模塊化如何?Java 9影響平台獨立性中引入的模塊化如何?Apr 27, 2025 am 12:15 AM

modularitydoesnotdirectlyaffectJava'splatformindependence.Java'splatformindependenceismaintainedbytheJVM,butmodularityinfluencesapplicationstructureandmanagement,indirectlyimpactingplatformindependence.1)Deploymentanddistributionbecomemoreefficientwi

什麼是字節碼,它與Java的平台獨立性有何關係?什麼是字節碼,它與Java的平台獨立性有何關係?Apr 27, 2025 am 12:06 AM

BytecodeinJavaistheintermediaterepresentationthatenablesplatformindependence.1)Javacodeiscompiledintobytecodestoredin.classfiles.2)TheJVMinterpretsorcompilesthisbytecodeintomachinecodeatruntime,allowingthesamebytecodetorunonanydevicewithaJVM,thusfulf

為什麼Java被認為是一種獨立於平台的語言?為什麼Java被認為是一種獨立於平台的語言?Apr 27, 2025 am 12:03 AM

javaachievesplatformIndependencEthroughThoJavavIrtualMachine(JVM),wodecutesbytecodeonyanydenanydevicewithajvm.1)javacodeiscompiledintobytecode.2)

圖形用戶界面(GUIS)如何提出Java平台獨立性的挑戰?圖形用戶界面(GUIS)如何提出Java平台獨立性的挑戰?Apr 27, 2025 am 12:02 AM

JavaGUI開發中的平台獨立性面臨挑戰,但可以通過使用Swing、JavaFX,統一外觀,性能優化,第三方庫和跨平台測試來應對。 JavaGUI開發依賴於AWT和Swing,Swing旨在提供跨平台一致性,但實際效果因操作系統不同而異。解決方案包括:1)使用Swing和JavaFX作為GUI工具包;2)通過UIManager.setLookAndFeel()統一外觀;3)優化性能以適應不同平台;4)使用如ApachePivot或SWT的第三方庫;5)進行跨平台測試以確保一致性。

Java開發的哪些方面取決於平台?Java開發的哪些方面取決於平台?Apr 26, 2025 am 12:19 AM

JavadevelovermentIrelyPlatForm-DeTueTososeVeralFactors.1)JVMVariationsAffectPerformanceNandBehaviorAcroSsdifferentos.2)Nativelibrariesviajnijniiniininiinniinindrododerplatefform.3)

在不同平台上運行Java代碼時是否存在性能差異?為什麼?在不同平台上運行Java代碼時是否存在性能差異?為什麼?Apr 26, 2025 am 12:15 AM

Java代碼在不同平台上運行時會有性能差異。 1)JVM的實現和優化策略不同,如OracleJDK和OpenJDK。 2)操作系統的特性,如內存管理和線程調度,也會影響性能。 3)可以通過選擇合適的JVM、調整JVM參數和代碼優化來提升性能。

Java平台獨立性有什麼局限性?Java平台獨立性有什麼局限性?Apr 26, 2025 am 12:10 AM

Java'splatFormentenceHaslimitations不包括PerformanceOverhead,versionCompatibilityIsissues,挑戰WithnativelibraryIntegration,Platform-SpecificFeatures,andjvminstallation/jvminstallation/jvmintenance/jeartenance.therefactorscomplicatorscomplicatethe“ writeOnce”

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用