创意电子

标题: 看完这篇,终于搞懂HashMap的源码了 [打印本页]

作者: Java码农之路    时间: 2020-8-27 13:48
标题: 看完这篇,终于搞懂HashMap的源码了
配景

HashMap是我们在平时开发最常用的容器之一,但是我们有真正了解过它吗?他是线程安全的吗?它是以何种方式来存储的呢?为什么初始化的容器大小是2的n次幂呢?他是怎样进行扩容的呢?他是怎样实现并发安全呢?等等一系列问题。正是知己知彼才能百战百胜,以是我打算深入理解一下hashMap
hashMap脑图


                               
登录/注册后可看大图



HashMap

hashMap的概述

hashMap,继承Map集合,以key-value情势存储,其中key可以为null ,value是可以重复,其数据是无序的,且会在扩容的时候发生改变。
hashMap在进行存储的时候的步骤

链表转红黑树


                               
登录/注册后可看大图

JDK1.7和1.8的扩容


                               
登录/注册后可看大图

hash计算的方式


    static final int hash(Object key) {        int h;        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);    }1234
static int indexfor(int h,int length) {// 其中的legth-1 也是为什么 hashMap的容量为2的n次幂的原因return h & (length-1);}1234从上面的两种通过hash值计算数组下表位置index的方式都可以将计算出来的值在数组length的长度内。至于那种性能更高速率更快,散列的空间更加匀称,那毋庸置疑,肯定1.8内里的。
上面说到可负载因子是0.75,为什么默认的负载因子是0.75呢?

hash冲突的几种解决方式




ConcurrentHashMap


                               
登录/注册后可看大图

public V get(Object key) {        Segment s;         HashEntry[] tab;        int h = hash(key);        long u = (((h >>> segmentShift) & segmentMask)
作者: 大毛怪咔咔    时间: 2020-8-28 07:37
转发了




欢迎光临 创意电子 (https://wxcydz.cc/) Powered by Discuz! X3.4