HashMap的底层原理?

HashMap是Java中常用的集合类,基于数组+链表+红黑树实现,提供高效的查询和插入删除操作。在解决hash冲突时,通过链表或红黑树来处理。初始容量为16,加载因子0.75,当达到扩容条件时,以2倍扩容。由于非线程安全,多线程环境下需额外同步。HashMap遍历顺序不确定,key可为null但value可有多个null。
摘要由CSDN通过智能技术生成

首先hashmap的话是一个常用的集合类框架,也是一个典型的数据结构,也是Java程序员最常用的,用于映射处理的数据。我们从整体上来看的话hashmap是由数组+链表+红黑树实现的。所以它具有了数组的查询效率和链表的添加、删除效率。而且数组也是hashmap的主体,存储数据的方式是使用的hashcode进行计算得到hash值,然后进行存储的。但是这样的话可能就会出现hash冲突的问题了,所以我们使用了链表的方式来解决这个hash冲突的问题,数组中的元素不单单只是一个元素,它还是一个链表的头结点。当我们遇到hash冲突的时候,我们只需要直接把元素插入当前节点的头结点位置就可以了,这样插入的方式是头插法,头插法在jdk1.8之后就改为了尾插法,这样的话是为了避免链表死循环。

红黑树的话就是当链表中的阈值大于8的时候,数组的长度大于64的时候,就会转换成红黑树了,但是当红黑树内的节点少于6个的时候就会转换成链表了。

hash冲突:就是说当我们使用hashcode进行计算时,得到的hash值在插入的时候,要插入的位置已经有了元素,这就是hash冲突,也是hash碰撞中的一点。

hashmap的初始长度是16,加载因子是0.75,当hashmap中的元素超过16*0.75=12个的时候,那么我们就需要进行扩容了,扩容的话是以2倍的形式进行扩容的,如果说之前的容量是16那么扩容后的容量就是32了。另外hashmap的线程是不安全的,因为它可以在任一时刻让多个线程同时写一个hashmap,这样的话会导致数据的不一致。

为什么不使用二叉树呢?主要是因为二叉树的趋势是递增或者递减,这样的话二叉树就会变成链表,就失去了二叉树的意义。

另外hashmap在遍历的时候是顺序是不确定的,因为是无序的。另外hashmap的主键key是可以有一个null值的,但是它的value值是可以有多个null值的。

另外hashmap中的键值对在jdk.8之前被称为entry,但是在jdk1.8之后就被称为node,node不仅包含了键值对key-value,还包含了计算出来的hash值,另外还包含了下一个节点的引用,如果下一个节点没有元素的话,那么node=null。

Hashmap

  1. 根据键的hashcode值来存数据
  2. 只允许一条记录的键为null,可以允许多条记录的值为null;(也就是说,每一个键只有唯一的,但是值可以有相同的)。
  3. 线程不安全
  4. 无序的
  5. 初始长度为16
  6. 加载因子为0.75

Hashmap的底层原理实际上是数组+链表的结合

数组的优缺点:

  1. 连续存储
  2. 查找效率高
  3. 添加、删除操作效率低

链表的优缺点:

  1. 离散存储
  2. 添加、删除效率高,扩展灵活
  3. 不能随机查询
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值