HasnMap (java 实现) -- 底层数据结构与扩容机制

(花了很长时间实现,先上代码)/** * @Author Franco Liang * @Date 2019/5/4 * @param <K> * @param <V> */public class HashMap<K, V> { /** * HashMap 底层数组元素为 Entry 对象 * Entry 对象包含...
摘要由CSDN通过智能技术生成

HashMap 原理

为什么HashMap查找速度是 O(1) ?

  1. 假如有一个数组a[10],在知道下标 i 的情况下,计算机只要计算 a + i 就能得到 a[i] 的地址,可以直接从存储器中取出数据,时间复杂度为 O(1)
  2. 如果期望的是数组下标与数据有特殊的关联,即 key-value ,key 不仅仅是 int 型数据,一种可行的解决方法就是对 key 做映射,数组下标 index = hash(key),为解决数据类型和唯一性的问题,应该用 key.hashcode
    做映射,这样就能做到接近直接用数组下标查找元素的速度

HashMap 底层数据结构

  • 数组 :底层基础结构
  • 链表:链地址法解决 hash 冲突
  • 红黑树:为提高查找效率,JDK1.8 后引入,但降低了插入、删除速度,当链表长度大于设置的阈值(默认大于8 时),会把链表改成红黑树

基本元素:Entry对象

  • private K key;
  • private V value;
  • private int hash; // key 经过hash函数映射后的地址(数组下标)
  • private Entry<K, V> next; // 指向Entry对象的指针

HashMap属性

  • private Entry<K, V>[] table; // Entry对象数组
  • private int size; // 已存放元素个数
  • private int defultLength = 1<<4; // 默认数组长度16
  • private static final float DEFAULT_LOAD_FACTOR = 0.75f; // 默认负载因子
  • private float loadFactor; // 容量阈值loadFactor = defultLength * DEFAULT_LOAD_FACTOR

扩容机制

  • 扩容条件:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值