entry類中需包含鍵值的hash值,防止resize時的重複計算;
map容量為2的整冪,可使用位操作取代取餘操作提高效率;
resize時需要將原table的桶內資料置null,利於垃圾**;
hash函式考慮資料高位的影響,可減少衝突。
1public
class myhashmapimplements imap
2122
public myhashmap(int initialcapacity, float
loadfactor)
30this.loadfactor =loadfactor;
31this.threshold = (int) (capacity *loadfactor);
32 table = new
entry[capacity];33}
3435
public myhashmap(int
initialcapacity)
3839
/**40
* 算術右移,計入高位影響
41*/
42static
int hash(int
h) 45
46@override
47public
v put(k k, v v)
51int hash =hash(k.hashcode());
52int i =indexfor(hash, table.length);
53for (entrye = table[i]; e != null; e =e.next) 60}
61addentry(k, v, i);
62return
null;63
}6465private
void addentry(k k, v v, int
index) 71}
7273
void resize(int
newcapacity)
8081
void
transfer(entry newtable) while (e != null
);100
}101
}102
}103
104private
v putfornull(v value)
108109
/**110
* 用位操作取代取餘操作,前提是陣列長度為2的冪次
111*/
112private
int indexfor(int hash, int
length)
115116
@override
117public
v get(k k)
126 e =e.next;
127}
128return
null
;129
}130
131static
class entry
143144
public
v setvalue(v v)
149150
public
boolean
equals(object o)
154 entry e =(entry) o;
155 object k1 =e.key;
156 object k2 =key;
157if (k1 == k2 || (k1 != null &&k1.equals(k2)))
163}
164return
false
;165
}166
}167 }
面試題總結 HashMap實現原理
jdk1.8中,hashmap採用位桶 鍊錶 紅黑樹實現,當鍊表長度超過閾值 8 時,將鍊錶轉換為紅黑樹,這樣大大減少了查詢時間。hashcode是jdk根據物件的位址或字串或者數字利用hash演算法計算出的int型別的數值。陣列 鍊錶 紅黑樹 首先有乙個每個元素都是鍊錶的陣列,當新增乙個元素 ke...
HashMap 學習總結
本文參考見 by chenssy 知識點 1.hashmap的三個建構函式 hashmap 預設初始容量為16,預設載入因子是0.75 hashmap int initialcapacity 指定初始容量 但預設載入因子為0.75 hashmap int initialcapacity,float ...
HashMap學習總結
答 雜湊表又稱雜湊表是一種k value鍵值對對應關係的資料結構,它通過乙個關鍵碼k,經過雜湊函式,能找到存在陣列上的記錄,查詢速度塊。答 它是底層主幹是陣列 雜湊表的主幹是陣列 陣列裡的每個元素都是煉表頭。到了jdk8,增加了紅黑樹結構,所以,總的來說陣列 鍊錶 紅黑樹。答 hashmap有雜湊表...