Map集合
map集合提供了一种通过键来访问值的方式,其中每一个键都是唯一的,值可以重复,Map接口常用的实现类有
HashMap、TreeMap、LinkedHashMap
Map集合的特点
- 键值对应
- 无序性
- 容许空值
- 非线程同步
使用HashMap动态存储数据
- loadFactor:负载因子,判断HashMap是否需要扩容,默认值为0.75
- threshold:阈值:当HashMap的大小超过一定的阈值是,会触发扩容操作,
HashMap存储数据的原理
HashMap的底层是数组,
存储结构:jdk7==数组+链表 jdk8 == 数组+链表+红黑树
存储过程
- 根据key值,在put的时候判断数组是否存在,如果不存在则用resize方法创建默认长度为16的数组
- 确定要存入的Node在数组中的位置,根据hash值与数组最大索引进行按位于运算得到索引位置
- 判断该位置是否有元素,如果没有直接创建一个Node存入,如果有元素,判断key是否相同,如果相同则覆盖,并且将原来的值直接返回,如果key不相同,在原Node基础上添加新的node,判断该位置是链表还是红黑树
- 如果是红黑树,将Node存入红黑树
- 如果是链表,遍历链表,找到最后一位,将Node存入
- 将Node存入链表之后,判断链表的结构是否要调整,判断链表长度是否超过8,如果超过8需要将链表装维红黑树,这里还有一个条件,如果数组的容量小于64,不转换红黑树,而是进行扩容,当数组容量大于64的时候再讲链表转为红黑树
- 存完后,再次判断数组是否需要进行扩容,根据负载因子来判断
使用TreeMap动态存储数据
- 有序性
- 基于红黑树
- 容许null
- 支持键值对的检索,插入、删除
- NavigableMap接口的实现
使用Hashtable存储数据
- 线程安全
- 键值不容许为null
- 解决哈希冲突
- 动态扩容