hashmap 源码解析 new HashMap()

本文深入解析HashMap的四种构造方法,包括默认构造函数、指定初始化大小、指定初始化大小和加载因子及指定map对象的方法。详细解释了如何计算扩容阈值threshold,并通过tableSizeFor方法确保其为2的幂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hashmap 源码解析 new HashMap<>(7)
hashmap 实例化有四个构造方法 分别是:
在这里插入图片描述
默认构造函数: 最常用

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

指定初始化大小的

public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }

指定初始化大小和加载因子的:

public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }

指定map 对象的:不常用

    public HashMap(Map<? extends K, ? extends V> m) {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        putMapEntries(m, false);
    }

一般调用 默认的构造函数 new HashMap<>(),很少用 HashMap(int initialCapacity)
现在来看看 这个构造方法都做了什么操作。

public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }

传入默认加载因子(DEFAULT_LOAD_FACTOR)和 入参initialCapacity 调用了 HashMap(int initialCapacity, float loadFactor) 方法

  public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)  // 小于0 抛异常
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY) // 如果大于最大值 设为最大值
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor)) // 验证加载因子 不能为空 也不能小于0
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        // 重点: 计算出map的扩容阈值threshold  大小(下一次扩容是的大小)
        // 其实这里面有个细节 : 设置的是扩容阈值 但是在resize() 的时候,又会把 threshold 的值赋给
        // newCap (map 的size) 能后设置 新的 threshold 为 0.75(加载因子)*newCap
        this.threshold = tableSizeFor(initialCapacity);
    }
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 < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

tableSizeFor 返回大于等于且最接近cap 的2的整数次幂的数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值