>[info] 在讀此節前,建議先看看:[深入淺出學Java—HashMap](https://blog.csdn.net/woshimaxiao1/article/details/83661464)
> 提示:沒必要精通,懂HashMap的基本原理即可
## **Map常用的有HashMap(LinkedHashMap )、TreeMap,其大致一樣**
~~~
import java.util.*;
public class Map {
public static void mapTest(){
/**
* HashMap、TreeMap兩種Map儲存數據結構不一樣,但是存儲的數據是一樣的,可以通過去掉注釋來切換
* 其中:
* HashMap 不一定會按照放進去的順序排序
* TreeMap 會按照Key進行排序
* LinkedHashMap 會按照放進去的順序排序,因為他是一個鏈表 *
*/
// HashMap<String, String> map = new HashMap <>();
// HashMap以以下順序輸出:{張三=湖北武漢, 大西=黑龍江哈爾濱, 小明=廣州中山, 小張=北京海淀}
// 沒有順序
//TreeMap <String, String> map = new TreeMap <>();
// TreeMap以以下順序輸出:{大西=黑龍江哈爾濱, 小張=北京海淀, 小明=廣州中山, 張三=湖北武漢}
// 排序方法是key的 A-Z
LinkedHashMap<String, String> map = new LinkedHashMap <>();
// LinkedHashMap以以下順序輸出:{小明=廣州中山, 小張=北京海淀, 大西=黑龍江哈爾濱, 張三=湖北武漢}
// 順序是我們放進去的順序
// tip:Map中的key值是唯一的,如果放相同key的數據則會復寫
map.put("小明", "廣州中山");
map.put("小張", "北京海淀");
map.put("大西", "黑龍江哈爾濱");
map.put("張三", "湖北武漢");
/**
* 一樣的方法(Api)
*/
System.out.println(map);
// 通過Key取值
String value = map.get("小明");
System.out.println(value);
// 判斷是否有某個key
boolean isSet = map.containsKey("小李");
System.out.println(isSet);
// 判斷是否有某個value
isSet = map.containsValue("廣州中山");
System.out.println(isSet);
// 獲取map長度
int size = map.size();
System.out.println(size);
// 獲取map所有的key
Set <String> allKeys = map.keySet();
System.out.println(allKeys);
// 獲取map所有的value
Collection <String> allValues = map.values();
System.out.println(allValues);
// 這個較難:把map轉換為entrySet數據格式
Set<java.util.Map.Entry<String ,String >> entrySet = map.entrySet();
System.out.println(entrySet);
for (java.util.Map.Entry entry: entrySet){
System.out.println("key = " + entry.getKey() + ";value = " + entry.getValue());
}
// 清除Map里的內容
map.clear();
System.out.println(map);
}
}
~~~
<br/>
## **我們如何選擇使用哪種Map的數據結構?**
* HashMap可以實現快速存儲和檢索,但缺點是包含的數據是無序的,適用于在Map中插入、刪除和定位元素,**如果對數據順序沒有要求的話可以優先使用HashMap**;
* TreeMap可以實現內部元素的排序,但性能比HashMap更差,適用于輸出按照排序的數據體。
* JDK1.7和1.8中HashMap的區別:
* 底層實現由 “數組+鏈表” 改為 “數組+鏈表+紅黑樹”
* 當鏈表節點較少時仍以鏈表存在,鏈表節點較多時,會轉為紅黑
~~~java
摘自:java.util.HashMap#TREEIFY_THRESHOLD
/**
* The bin count threshold for using a tree rather than list for a
* bin. Bins are converted to trees when adding an element to a
* bin with at least this many nodes. The value must be greater
* than 2 and should be at least 8 to mesh with assumptions in
* tree removal about conversion back to plain bins upon
* shrinkage.
*/
static final int TREEIFY_THRESHOLD = 8;
~~~