HashMap 简析

作者: zcwfeng | 来源:发表于2021-04-26 18:15 被阅读0次

HashMap 的主要用途

HashMap基于Map接口实现<key,value>存储结构,允许null,同时无序,线程不安全

底层实现,数组+链表+红黑树(1.8)

查找数据根据Key的hashcode 计算具体存储位置

HashMap最多只允许一条key=null的记录

HashMap增删改查效率不错,是ArrayList和LinkedList的折中实现

阈值threshold 容量

`细节`

底层数组:Node<K,V> table,充当哈希表的作用,存储hash的位置元素Node<K,V> 数组长度总是2的N次幂

负载因子:loadFactor,默认是0.75


1.根据插入Key的hash值,通过(n-1)& hash 「当前元素的hash值&hash表长度-1」---hash值%hash表长度,计算存储位置table[i],如果没有元素,直接放在table[i],如果存在。判断当前hash值和key是否一致,如果一致,则是修改value,覆盖value

2.如果存在table[i],但是hash值和当前操作值不一致,证明出现了hash冲突
判断头结点是否是treeNode,是的话按照红黑树方式增加节点。
如果不是就是单链表,节点插入到链表最后的位置。
判断当前链表长度是不是大于等于8,如果是把链表转换成红黑树。

3.插入成功判断当前,存储键值对的数量,大于threhold阈值扩容,

4.扩容
假设底层hash表大小16,负载0.75,存储个数 16 * 0.75 = 12 ,等于12的时候出发扩容。

负载因子越大,HashMap的装载程度越高,发生hash碰撞的几率就越大,链表拉长,效率变慢

负载因子小,链表稀疏,控件浪费,查询效率高。

使用时候,我们会预估key-value的容量size,通过size/loadFactor 计算需要初始化的容量 initialCapacity,可以避免存放到达阈值threshold频繁调用resize方法扩容

使用HashMap使用什么对象作为Key比较好,为什么

不可变对象,因为可变对象的hash值可能被改变,造成再次进行hash &(length-1) 取模运算位置改变导致数据丢失。

所以尽量选择Integer,String等不可变类型。

HashMap不安全,多线成操作会怎样

当我们对HashMap遍历,不能对HashMap添加,删除等更改操作,否则抛出ConcurrentModificationException。如果线程安全考虑使用
ConcurrentHashMap,多线程HashMap扩容resize可能导致死循环。

HashMap和HashTable的区别

1.整体结构
HashMap允许key为null,对value没处理
HashTabl的key和value都不允许为null,直接返回NPE

2.容量设定和扩容机制不一样
HashMap默认16,扩容一定是2的n次方
HashTable默认是11,扩容是原来的2被再加上1 扩容---「(oldCapacity << 1)+1」

3.hash分布方式

HashMap是key经过计算hash值,利用hash & (length-1) 取膜运算,HashTable容量不一定是2的n次方,不适用

相关文章

  • HashMap 简析

    HashMap 的主要用途 使用HashMap使用什么对象作为Key比较好,为什么 不可变对象,因为可变对象的ha...

  • HashMap源码简析

    说到HashMap相信大家并不陌生,这是一个非常常用的以键值对形式存储的数据结构,但是对其内部原理可能不是很了解,...

  • HashMap原理简析

    前言:该文像是一片全貌介绍,重点主要落在equals方法和hashCode方法,这篇浅谈Java中的hashcod...

  • HashMap源码简析

    HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射操作,并允许使用 null 值和...

  • HashMap,LinkedHashMap简析及LruCache

    简介 HashMap:数组+单向链表 LinkedHashMap: HashMap + 双向循环链表 LruCac...

  • Java集合(五)--HashMap简析

    前面分析了List的两个实例类,现在我们开始分析Map。至于为什么跳过Set先分析Map。嘿嘿,Set中的Hash...

  • HashMap实现原理简析(哈希表)

    什么是HashMap HashMap在应用层的使用非常广泛,用来储存键值对。它使用哈希函数来做索引因此性能较高。同...

  • mybatis-spring解析

    1、概述 原生Mybatis源码简析(上)原生Mybatis源码简析(下)在介绍原生Mybatis源码简析文章中,...

  • 简析 Swift 的模块系统

    简析 Swift 的模块系统 简析 Swift 的模块系统

  • 简析Swift和C的交互

    简析Swift和C的交互 简析Swift和C的交互

网友评论

    本文标题:HashMap 简析

    本文链接:https://www.haomeiwen.com/subject/mgjqcltx.html