今天學完IT十八掌第十二天java基礎課程:
學習內容:
HashMap和HashTable底層都是採用數組+鏈表實現的。
結合了數組的尋址快,鏈表增刪快的特點。使用散列算法(hash算法)將元素分配到數組的元素當中,
hash分區默認16個,每個分區內存儲的是鏈表
1,算出hashcode,進行&0xof取出後四位初步比較,確定分區
2,然後拿對象和鏈表中每個對象相比較,比較每個對象的hash碼是否相同。
1. 判斷hashcode是否相同
2.判斷是否同一對象或者equals返回true
所以之前的結論:HashSet判斷元素是否相同與元素是否同一對象無關有缺陷,通過查看源代碼
我們知道HashSet底層是採用上述方法判定元素是否相同的。
HashSet底層調用的是HashMap,只關心map的key集合
底層是數組,存儲的鏈表對象。
判斷對象是否重複的方法在下圖中。
所以這裏可以進一步總結HashSet判斷元素是否相同的原理。
首先,判斷hashCode是否相同,否,兩元素不重複;是,進一步判斷
其次,兩個對象是否是同一對象,是,兩元素重複( | | 短路);否,進一步判斷
再次,eauals方法返回true,兩元素重複,返回false,兩元素不重複。
判斷完畢
二,Collections和Arrays工具類
遇到的問題:
1, HashMap的entrySet()和keySet()方法遍歷集合。
2, 使用增強for循環迭代集合
3, Debug使用不熟練,
4,線程安全的集合Vector,HashTable使用。
5,hash算法以及HashMap原理實現。
需要幫助的問題
HashMap底層原理以及HashSet的區別與聯繫沒聽懂,對數據結構知識不熟悉