0906Map集合

本文详细介绍了Java中Map集合的使用,包括HashMap、TreeMap和Hashtable的区别,如无序性、线程安全性和数据存储原理,重点讲解了HashMap的动态扩容与存储机制,以及TreeMap的有序性特征。
摘要由CSDN通过智能技术生成

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. 动态扩容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值