容器(二) 双例集合
1、Map接口介绍
Map中不能包含重复的Key,但可以包含重复的Value。
Map中的常用方法
put方法:key不存在时返回空,key存在时更新value,并返回旧的value。
2、HashMap容器类
通过KeySet获取元素
Set<String> set = map.keySet();
for (String s:set){
System.out.println(s+" "+map.get(s));
}
通过entrySet方法获取Map.Entry类型获取元素
Set<Map.Entry<String,String>> set1 = map.entrySet();
for (Map.Entry<String,String> ss:set1){
System.out.println(ss);
}
Map容器的并集操作(两个Map泛型要相同)
map1.putAll(map);
如果Key相同,map中的Value会覆盖map1中的Value
3 HashMap的底层源码分析
HashMap底层采用的是Hash表,Hasp表的本质是“数组+链表”。
jdk1.7中使用纯链表
jdk1.8中
链表的节点大于8时,转换为红黑树
红黑树的节点小于6时,转换为链表
成员变量
数组的默认长度为16。
数组的长度最大值为2^30
数组扩容的负载因子为0.75,当数组容量使用超过75%,就要去扩容。
链表长度大于8时转为红黑树
红黑树树的节点小于6时,转为链表
数组长度大于等于64时,才对长度大于8的链表转为红黑树
记录Map中键值对的数量
HashMap中的数组,节点类型为Node
HashMap中存储元素的节点类型
链表节点:
红黑树节点:
TreeNode继承Node
数组初始化
计算Hash值
先将hashcode和hashcode右移16位的数异或,结果返回hashcode
再将hashcode与数组长度-1想与。
元素添加
数组扩容
二倍扩容
TreeMap容器类
Key要实现比较规则。
使用方式与TreeMap一样,既可以在定义类中实现comparable接口中的comparTo类,也可以自定义比较器(实现Comparator接口中的compare方法)去比较。
自定义比较器去比较时,初始化TreeMap时在括号中给定比较器