Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解
HashMap和HashSet都是存儲(chǔ)在哈希桶之中,我們可以先了解一些哈希桶是什么。

像這樣,一個(gè)數(shù)組數(shù)組的每個(gè)節(jié)點(diǎn)帶著一個(gè)鏈表,數(shù)據(jù)就存放在鏈表結(jié)點(diǎn)當(dāng)中。哈希桶插入/刪除/查找節(jié)點(diǎn)的時(shí)間復(fù)雜度是O(1)
map代表存入一個(gè)key值,一個(gè)val值。map可多次存儲(chǔ),當(dāng)?shù)诙尾迦霑r(shí),會(huì)更新val值。
set代表只存入一個(gè)key值,但在實(shí)際源碼中,set的底層其實(shí)也是靠map來(lái)實(shí)現(xiàn)的。set只能存入數(shù)據(jù)一次,當(dāng)?shù)诙尾迦霑r(shí),若哈希桶中存在元素則返回false。
下面是代碼實(shí)現(xiàn)
// key-value 模型
public class HashBucket {
private static class Node {
private int key;
private int value;
Node next;
public Node(int key, int value) {
this.key = key;
this.value = value;
}
}
private Node[] array;
private int size; // 當(dāng)前的數(shù)據(jù)個(gè)數(shù)
private static final double LOAD_FACTOR = 0.75;
public int put(int key, int value) {
int index = key % array.length;
// 在鏈表中查找 key 所在的結(jié)點(diǎn)
// 如果找到了,更新
// 所有結(jié)點(diǎn)都不是 key,插入一個(gè)新的結(jié)點(diǎn)
for (Node cur = array[index]; cur != null; cur = cur.next) {
if (key == cur.key) {
int oldValue = cur.value;
cur.value = value;
return oldValue;
}
} N
ode node = new Node(key, value);
node.next = array[index];
array[index] = node;
size++;
if (loadFactor() >= LOAD_FACTOR) {
resize();
} r
eturn -1;
}
private void resize() {
Node[] newArray = new Node[array.length * 2];
for (int i = 0; i < array.length; i++) {
Node next;
for (Node cur = array[i]; cur != null; cur = next) {
next = cur.next;
int index = cur.key % newArray.length;
cur.next = newArray[index];
newArray[index] = cur;
}
} a
rray = newArray;
}
private double loadFactor() {
return size * 1.0 / array.length;
}
public HashBucket() {
array = new Node[8];
size = 0;
}
public int get(int key) {
int index = key % array.length;
Node head = array[index];
for (Node cur = head; cur != null; cur = cur.next) {
if (key == cur.key) {
return cur.value;
}
}
return -1;
}
}
到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet的文章就介紹到這了,更多相關(guān)java HashMap和HashSet內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹(shù)的實(shí)現(xiàn)方法和原理詳解
- Java數(shù)據(jù)結(jié)構(gòu)中七種排序算法實(shí)現(xiàn)詳解
- Java數(shù)據(jù)結(jié)構(gòu)中關(guān)于AVL樹(shù)的實(shí)現(xiàn)方法詳解
- Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表詳解
- Java數(shù)據(jù)結(jié)構(gòu)篇之實(shí)現(xiàn)二叉搜索樹(shù)的核心方法
- Java數(shù)據(jù)結(jié)構(gòu)與算法之二分查找詳解
- Java常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解
- java手動(dòng)實(shí)現(xiàn)常見(jiàn)數(shù)據(jù)結(jié)構(gòu)的示例代碼
相關(guān)文章
Java基于Tcp協(xié)議的socket編程實(shí)例
這篇文章主要介紹了Java基于Tcp協(xié)議的socket編程實(shí)例,較為詳細(xì)的分析了socket編程客戶端與服務(wù)器端的具體實(shí)現(xiàn)步驟與使用技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
Java7到Java17之Switch語(yǔ)句進(jìn)化史示例詳解
這篇文章主要為大家介紹了Java7到Java17之Switch語(yǔ)句進(jìn)化史示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Spring Security學(xué)習(xí)筆記(一)
這篇文章主要介紹了Spring Security的相關(guān)資料,幫助大家開(kāi)始學(xué)習(xí)Spring Security框架,感興趣的朋友可以了解下2020-09-09
java 操作gis geometry類型數(shù)據(jù)方式
這篇文章主要介紹了java 操作gis geometry類型數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
mybatis執(zhí)行批量更新batch update 的方法(oracle,mysql兩種)
這篇文章主要介紹了mybatis執(zhí)行批量更新batch update 的方法,提供oracle和mysql兩種方法,非常不錯(cuò),需要的朋友參考下2017-01-01
使用SpringMVC訪問(wèn)Controller接口返回400BadRequest
這篇文章主要介紹了使用SpringMVC訪問(wèn)Controller接口返回400BadRequest,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

