hashMap,treeMap,LinkedHashMap使用以及區別分析

去年校招時候基本hashmap每家都問,所以就結合自己的工作談一談對這三個的理解,有錯誤歡迎指出,畢竟新手,大神勿噴。

1、HashMap

這個相信只要寫java的人都用過,無序,線程不安全。這裏我主要寫一寫無序,線程不安全以後有機會再寫一篇吧。要注意的是jdk1.8以後hashMap源碼 變了,底層優化了。以後要是面試官問你hashMap怎麼存儲,你就不能說按照數組存儲節點,hash值相同時直接往後排列,相當於數組中對應的元素都是鏈表。這就錯啦!!!jdk1.8之後添加了這個屬性

 static final int TREEIFY_THRESHOLD = 8;

這個表示當相同hash值相同的元素大於8個時候,存儲結構會變成紅黑樹來存儲,方便查找,手動畫圖表示

hashMap測試代碼如下

public class MapTest {

	public static void main(String[] args) {

		Map<String,String> map = new HashMap<String,String>();
		for(int i = 0;i<100;i++){
			map.put("ffff"+i, "sss");
		}
		Iterator it = map.entrySet().iterator();
		while(it.hasNext()){
			Map.Entry  entry = (Entry) it.next();
			System.out.println(entry.getKey());
		}
	
	}

}

輸出部分結果如下:ffff1
ffff18
ffff0
ffff17
ffff3

2、TreeMap

TreeMap會按照key值默認排序,這樣會很方便我們操作。假設一個業務場景,你需要在頁面輸出過去兩個月內每天門網站註冊人數,這時候你就可以從數據庫中取出值放入treeMap中,key用一個String的date,value用註冊人數,然後遍歷treemap就可以了,測試代碼如下

public class MapTest {

	public static void main(String[] args) {

		Map<String,String> map = new TreeMap<String,String>();
		for(int i = 0;i<100;i++){
			map.put("ffff"+i, "sss");
		}
		Iterator it = map.entrySet().iterator();
		while(it.hasNext()){
			Map.Entry  entry = (Entry) it.next();
			System.out.println(entry.getKey());
		}
	
	}

}

輸出結果如下:

ffff0
ffff1
ffff10
ffff11
ffff12
ffff13
ffff14
ffff15
ffff16
ffff17
ffff18
ffff19
ffff2
ffff20
ffff21
ffff22

可以看出按照key值進行排序輸出,主要原理是put函數內部使用了Comparator比較器。關鍵代碼是這段

i = comparator1.compare(obj, entry.key);
if (i < 0)
    entry = entry.left;
else if (i > 0)
    entry = entry.right;
else
    return entry.setValue(obj1);

3、LinkedHashMap

LinkedHashMap可以保存輸入順序,這點在key值爲中文時候特別方便(雖然key值不建議爲中文)。比如你現在要在頁面中輸出早上,中午,晚上分別註冊的人數,頁面順序也按照早上、中午、晚上排列,測試代碼如下

public class MapTest {

	public static void main(String[] args) {

		Map<String,Integer> map = new LinkedHashMap<String,Integer>();

		map.put("早上", 800);
		map.put("中午", 2000);
		map.put("晚上", 1000);
		
		Iterator it = map.entrySet().iterator();
		while(it.hasNext()){
			Map.Entry  entry = (Entry) it.next();
			System.out.println(entry.getKey()+" "+entry.getValue());
		}
	
	}

}

輸出結果

早上 800
中午 2000
晚上 1000

這個原理還不是很明白,以後看懂了再來寫個關於源碼解讀的吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章