目录
Map接口介绍
Map实现类
HashMap
HashTable
ConcurrentHashMap
TreeMap
Map接口介绍
特点:
- 键值对(key,value),键不可以重复,值可以重复,
- 键重复则会被覆盖,没有继承Collection
- 支持用户自由绑定Key值与Value
Map实现类
HashMap
- 无序,作为成员变量是线程不安全
- 初始长度16,负载因子
-
扩容初始容量16,负载因子0.75,扩容增量1倍
-
键和值都允许为空
特点:
- 键值对(key,value),键不可以重复,值可以重复,
- 键重复则会被覆盖,没有继承Collection
- 支持用户自由绑定Key值与Value
HashMap
- 无序,作为成员变量是线程不安全
- 初始长度16,负载因子
-
扩容初始容量16,负载因子0.75,扩容增量1倍
-
键和值都允许为空
- 无序,作为成员变量是线程不安全
- 初始长度16,负载因子
-
扩容初始容量16,负载因子0.75,扩容增量1倍
-
键和值都允许为空
遍历示例
public void demo3() {
Map map = new HashMap<>();
map.put("4", "小明");
map.put("2", "小宝");
map.put("3", "小麦");
map.put("1", "小黑");
map.put("1", "zl");
map.put("1", "小明");
Iterator> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry next = it.next();
System.out.println(next.getKey() + " : " + next.getValue());
}
}
基本原理
JDK8之前Table数组中的Node()处理逻辑:(紫色处为链结构)
绿色标出的部分为JDK8新增的处理逻辑,目的是在Table[i]中的Node节点数量大于8时,通过红黑树提升查找速度
原理:使用加入HashMap的key并通过一系列hash算法等来计算出这个key对应的桶位号,这个桶号就是在array数组里面的下标位置,如果这个桶中有元素了,并且超过8个,就使用数结构,低于8个就采用链表结构
HashTable
线程安全,不太常用
ConcurrentHashMap
线程安全,比HashTable性能高
注意:jdk8之前是十六把锁,jdk8之后是每一个桶一把锁
TreeMap
- key值按一定的顺序排序,基于红黑树,容量无限制,非线程安全,比较常用
- 添加或获取元素时性能较HashMap慢(因为需求维护内部的红黑树,用于保证key值的顺序)
- 能比较元素的大小,根据key比较(元素的自然顺序,集合中自定义的比较器也可排序)
private TreeMap treeMap;
@Before
public void setup() {
treeMap = new TreeMap(new Comparator() {
@Override
public int compare(String o1, String o2) {
// 负数 0 正数
return o1.compareTo(o2);
}
});
treeMap.put("1", new Student(5, "小白"));
treeMap.put("2", new Student(3, "小黑"));
treeMap.put("3", new Student(2, "小黄"));
treeMap.put("4", new Student(4, "小明"));
treeMap.put("3", new Student(1, "小黑"));
treeMap.put("4", new Student(4, "小明"));
}
LinkedHashMap
- 继承HashMap
- 维护了一个双向链表
- LinkedHashMap是有序的,且默认为插入顺序
- 默认情况下使用entryset获取的集合顺序是与节点的插入顺序(默认是按照插入的顺序进行排列的,最先插入的节点(即最老的节点)为head,最新插入的节点为tail)
MaplinkedHashMap = new LinkedHashMap<>(); @Test public void linkedHashMap() { linkedHashMap.put("5", "嘿嘿"); linkedHashMap.put("4", "喜喜"); linkedHashMap.put("1", "哈哈"); linkedHashMap.put("3", "呵呵"); linkedHashMap.put("3", "嗨嗨"); linkedHashMap.put("4", "喜喜"); linkedHashMap.put("1", "哈哈"); Set > set = linkedHashMap.entrySet(); Iterator > iterator = set.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); } }



