0906Map集合

Map集合

map集合提供了一种通过键来访问值的方式,其中每一个键都是唯一的,值可以重复,Map接口常用的实现类有

HashMap、TreeMap、LinkedHashMap

Map集合的特点

  1. 键值对应
  2. 无序性
  3. 容许空值
  4. 非线程同步

使用HashMap动态存储数据

  1. loadFactor:负载因子,判断HashMap是否需要扩容,默认值为0.75
  2. threshold:阈值:当HashMap的大小超过一定的阈值是,会触发扩容操作,

HashMap存储数据的原理

HashMap的底层是数组,

存储结构:jdk7==数组+链表 jdk8 == 数组+链表+红黑树

存储过程

  1. 根据key值,在put的时候判断数组是否存在,如果不存在则用resize方法创建默认长度为16的数组
  2. 确定要存入的Node在数组中的位置,根据hash值与数组最大索引进行按位于运算得到索引位置
  3. 判断该位置是否有元素,如果没有直接创建一个Node存入,如果有元素,判断key是否相同,如果相同则覆盖,并且将原来的值直接返回,如果key不相同,在原Node基础上添加新的node,判断该位置是链表还是红黑树
  4. 如果是红黑树,将Node存入红黑树
  5. 如果是链表,遍历链表,找到最后一位,将Node存入
  6. 将Node存入链表之后,判断链表的结构是否要调整,判断链表长度是否超过8,如果超过8需要将链表装维红黑树,这里还有一个条件,如果数组的容量小于64,不转换红黑树,而是进行扩容,当数组容量大于64的时候再讲链表转为红黑树
  7. 存完后,再次判断数组是否需要进行扩容,根据负载因子来判断

使用TreeMap动态存储数据

  1. 有序性
  2. 基于红黑树
  3. 容许null
  4. 支持键值对的检索,插入、删除
  5. NavigableMap接口的实现

使用Hashtable存储数据

  1. 线程安全
  2. 键值不容许为null
  3. 解决哈希冲突
  4. 动态扩容

你可能感兴趣的:(java,开发语言)