HashMap
HashMap的相关介绍
hello_cmy
这个作者很懒,什么都没留下…
展开
-
搞定ConcurrentHashMap!
目录1、JDK7中数据结构2、形象理解 ConcurrentHashMap3、核心源码分析4、JDK8的改进5、涉及的其他问题1、JDK7中数据结构ConcurrentHashMap是由Segment数组与HashEntry数组构成。每个ConcurrentHashMap持有一个Segement数组。而每个Segment对象由一个HashEntry数组构成。HashEntr数组其实就是一个小的...原创 2020-04-26 20:55:56 · 473 阅读 · 0 评论 -
HashMap与HashTable续---快速失败(fail-fast)机制
HashMap在面试中是必问的,那么提到HashMap的线程是否安全问题,就会提到HashTable 跟 ConcurrentHashMap 的一系列相关问题,那么今天来梳理一下ConcurrentHashMap 。HashMap允许key或value为null的,但是 Hashtable不允许键或值为 null 的, 这是为什么呢?因为Hashtable在我们put 空值的时候会直接抛空...原创 2020-04-16 10:34:52 · 2102 阅读 · 4 评论 -
HashMap的长度为什么是2的幂次方
HashMap的长度为什么是2的幂次方1、只有当数组长度为2的幂次方时,hash&(length-1)才等价于h%length,即实现了key的定位,2的幂次方也可以减少冲突次数,提高HashMap的查询效率;2、如果 length 为 2 的次幂 则 length-1 转化为二进制必定是 11111……的形式,再于 hash 的二进制与操作效率会非常的快,而且空间不浪费;如果 len...原创 2020-04-02 16:05:34 · 504 阅读 · 0 评论 -
为什么重写equals方法要重写hashCode方法
为什么重写equals方法要重写hashCode方法这两个方法都是Object类中的。首先先解释一下这两个方法。上源码吧。equals()public boolean equals(Object obj) { return (this == obj);}可以看到,该方法就是判断两个对象是否是同一个对象。底层是使用 == 来实现的。咱们也知道,== 作用于引用类型,比较的是两个对...原创 2020-03-29 18:18:56 · 129 阅读 · 0 评论 -
HashMap中的链表转化为红黑树
JDK1.8后,HashMap的底层数据结构是数组+链表+红黑书。从源码中 我们知道:Hashmap中的链表大小超过八个时会自动转化为红黑树,当删除小于六时重新变为链表,也没有问过为啥,百度一波。根据泊松分布,在负载因子默认为0.75的时候,单个hash槽内元素个数为8的概率小于百万分之一,所以将7作为一个分水岭,等于7的时候不转换,大于等于8的时候才进行转换,小于等于6的时候就化为链表。...原创 2020-03-27 17:59:09 · 4681 阅读 · 5 评论 -
HashMap线程不安全原因及解决
HashMap线程不安全的原因:1、put的时候导致的多线程数据不一致。这个问题比较好想象,比如有两个线程A和B,首先A希望插入一个key-value对到HashMap中,首先计算记录所要落到的桶的索引坐标,然后获取到该桶里面的链表头结点,此时线程A的时间片用完了,而此时线程B被调度得以执行,和线程A一样执行,只不过线程B成功将记录插到了桶里面,假设线程A插入的记录计算出来的桶索引和线程B要插...原创 2020-03-27 15:09:58 · 11657 阅读 · 0 评论 -
HashTable和HashMap区别
1、继承的父类不同Hashtable继承自Dictionary类。HashMap继承自AbstractMap类。但二者都实现了Map接口。public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {}public...原创 2020-03-27 13:01:37 · 200 阅读 · 0 评论 -
HashMap1.7和1.8的的不同点
JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头 插法就是能够提高插入的效率,但是也会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。扩容后数据存储位置的计算方式也不-样:1). 在JDK1.7的时候是直接用hash值和需要...原创 2020-03-26 17:52:20 · 138 阅读 · 0 评论 -
HashMap源码分析
源码分析基于JDK1.84个构造函数HashMap()//1. 无参构造/** * Constructs an empty <tt>HashMap</tt> with the default initial capacity * (16) and the default load factor (0.75). *///构造一个空的HashMap,初始容量为...原创 2020-03-26 15:09:05 · 140 阅读 · 0 评论 -
HashMap的最大容量为什么是1左移30(2的30次方)
/** * The maximum capacity, used if a higher value is implicitly specified * by either of the constructors with arguments. * MUST be a power of two <= 1<<30. */static final int MAXIMUM_C...原创 2020-03-26 11:39:40 · 1568 阅读 · 0 评论 -
HashMap底层原理
一 什么是map?想要了解是什么是HashMap,首先你要知道什么是map,map就是用于存储键值对(<key,value>)的集合类,也可以说是一组键值对的映射(数学概念)。注意,我这里说的只是map的概念,是为了通俗易懂,面试时候方便记忆,但是你自己一定要明白,在java中map是一个接口,是和collection接口同一等级的集合根接口。map的存储结构二 其他的...原创 2019-08-07 11:14:16 · 276 阅读 · 0 评论