1、背景
面試當中我們肯定會被問到集合,那集合當中hashMap被問到的概率是非常高的。這也是我們開發當中經常用到的集合類型,下面我就簡單的對這個集合做了總結。主要是對這個集合的使用進行操作。然後對他具體是實現進行了簡單的總結
2、hashMap的使用
就直接上代碼吧,如下:
/**
* 1、輸出是無序的
* 2、可以爲key值NULL,value也可以爲NUll
* 3、可以存對象但是遍歷的時候需要判斷類型,否則會異常
*/
public void hashMaptest(){
HashMap hashMap=new HashMap();
UserInf userInf=new UserInf();
userInf.setUserId(1);
userInf.setUserName("王一");
hashMap.put("數據key1","數據value1");
hashMap.put("數據key2","數據value2");
hashMap.put("數據key3","數據value3");
hashMap.put("數據key4","數據value4");
hashMap.put(null,null);
hashMap.put("數據key5","數據value5");
hashMap.put(userInf,1);
System.out.println("單獨取userInf:"+hashMap.get(userInf));
//防止下面異常,決定刪除對象爲key的內容
hashMap.remove(userInf);
Iterator iter=hashMap.entrySet().iterator();
while (iter.hasNext()){
Map.Entry entry = (Map.Entry) iter.next();
String key=(String)entry.getKey();
String value=(String) entry.getValue();
System.out.println("key:"+key+"===value:"+value+"\n");
}
System.out.println("單獨取key1:"+hashMap.get("數據key1"));
}
上面是我測試寫的代碼,我們可以看到結果:
主要是證明下面幾點在註釋中有說到,無序,可以存對象可以存null
這裏我需要說明一下key值存對象的時候,要重寫下equal和hashcode方法。你們要問爲什麼?
其實去百度一下有很多更加完美的解釋,我這就簡單粗暴的說一下唄
因爲hashMap的key值是不可以重複的,你存入對象的時候,他會判斷你的map集合裏面是否已經有已經存在的數據;
這樣就是通過equal和hashcode計算你的重複,如果你不重新寫,那就是默認Object的方法,結果可想而知。有可能你的 對象比如說你new了兩個,但是你的對象裏面的值是一模一樣的。所以在我們普通人的世界裏面是認爲這兩個對象是一樣的,但是在java對象裏面你new了兩個對象那麼他們就是不一樣的哦。而且你下次使用key對象去查詢也不太好查詢出來。
大概就是這麼個意思吧個人理解。
3、hashMap底層原理
底層怎麼實現的我這沒這水平寫不出來代碼,所以我就自己更具大家說的我選出了比較容易理解的。下面是別人家博客說的大概意思
HashMap底層就是一個數組結構,數組中的每一項又是一個鏈表。數組+鏈表結構,新建一個HashMap的時候,就會初始化一個數組。Entry就是數組中的元素,每個Entry其實就是一個key-value的鍵值對,它持有一個指向下一個元素的引用,這就構成了鏈表,HashMap底層將key-value當成一個整體來處理,這個整體就是一個Entry對象。HashMap底層採用一個Entry【】數組來保存所有的key-value鍵值對,當需要存儲一個Entry對象時,會根據hash算法來決定在其數組中的位置,在根據equals方法決定其在該數組位置上的鏈表中的存儲位置;當需要取出一個Entry對象時,也會根據hash算法找到其在數組中的存儲位置, 在根據equals方法從該位置上的鏈表中取出Entry;
4、總結
集合當中我們面試還是使用當中最容易遇到的就是hashMap集合,因爲他可以作爲一個仿對象使用,而且效率還比較高
下面記錄幾點;
1、初始大小是16
2、擴容2的次冪
3、負載因子0.75