JDK8 内HashMap底层实现

Hope ·
更新时间:2024-11-10
· 911 次阅读

构造

首先来看下hashMap的构造方法

HashMap hashMap = new HashMap();

hashMap的无参构造方法非常简单,内部只是默认值的初始化,加载因子 0.75f

public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted }

直接来看下hashMap的两个参数构造方法,在默认值初始化的时候,tableSizeFor控制着hashMap size的大小,具体的实现下看:

public HashMap(int initialCapacity, float loadFactor) { ... // 一些校验判断 this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); }

可读性比较差,我们通过枚举几个cap值,来看下这个方法的作用:

static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n = MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }

通过图示枚举的cap值,能够发现tableSizeFor 的作用,是为了保证hashMap size 是2的幂,例如我们new HashMap(7),底层实际分配的size 不是 7,而是23 = 8。为何会如此,看下文。
博客专家 原创文章 64获赞 192访问量 17万+ 关注 私信 展开阅读全文
作者:mjzuo



jdk8 hashmap jdk

需要 登录 后方可回复, 如果你还没有账号请 注册新账号