>[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;
~~~