目录
Map接口介绍
特点:
- 键值对(key,value),键不可以重复,值可以重复,
- 键重复则会被覆盖,没有继承Collection
- 支持用户自由绑定Key值与Value
Map实现类
HashMap
- 无序,作为成员变量是线程不安全
- 初始长度16,负载因子
扩容初始容量16,负载因子0.75,扩容增量1倍
键和值都允许为空
遍历示例
public void demo3() {
Map<String, String> map = new HashMap<>();
map.put("4", "小明");
map.put("2", "小宝");
map.put("3", "小麦");
map.put("1", "小黑");
map.put("1", "zl");
map.put("1", "小明");
Iterator<Entry<String, String>> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry<String, String> 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<String,Student> treeMap;
@Before
public void setup() {
treeMap = new TreeMap<String,Student>(new Comparator<String>() {
@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)
Map<String, String> linkedHashMap = 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<Entry<String, String>> set = linkedHashMap.entrySet();
Iterator<Entry<String, String>> 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);
}
}