HashMap(二):构造函数

本文详细探讨了HashMap的四个构造函数,指出它们主要负责初始化容量、阈值和加载因子。在构造过程中,并未直接初始化存储数据的table数组,而是在第一次put数据时进行。此外,还介绍了tableSizeFor方法,该方法用于计算大于输入值且最接近2的整数幂的数,确保HashMap的容量始终为2的幂。最后一个构造函数接受另一个HashMap实例,可能用于克隆或复制HashMap,通过putMapEntries方法处理源HashMap中的所有元素。

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

一、HashMap的四个构造函数:

1、

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);
    }

2、

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

3、

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

4、

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

二、构造函数解释:

  • 前三个构造函数可以统一看,从源码中可以看出,使用构造函数创建HashMap时,只是把HashMap的加载因子进行初始化,如果指定了初始化容量大小则把容量也初始化。可以看到,构造函数只是赋值了容量、阈值和加载因子这三个属性,并没有对存储数据的table数组进行赋值,什么时候赋值呢?答案是第一次put数据的时候。下一节说。

构造函数里面还有一个tableSizeFor方法,此方法的作用就是算出比输入的数大且最接近2的整数幂的数。原理简单说一下:
一个二进制的数,先无符号右移一位再和原来的数进行位或操作,就会把原来最高位的1后面的一个数也变成1,这样就有两个1了。同理,再右移两位,就有四个1了,以此类推,先右移1位,然后再位移2位,再位移4位,再位移8位,最后就会得到一个全是1的二级制数,最后再加一就是最大的2次幂了。举个栗子:
原来数为 0111 1100 0011 1101
右移一位 0011 1110 0001 1110
再位或得 0111 1110 0011 1111
右移两位 0001 1111 1000 1111
再位或得 0111 1111 1011 1111
。。。。。
以此类推发现为1的最高位后面在渐渐补1,最后都补满1再加1也就是最接近的2次幂了。所以对于int来说,本身占用32个二进制位,只需要位移1,2,4,8,16即可。

  • 对于最后一个构造函数,就是构造时再传入一个HashMap,个人理解有点像为了达到类似clone的功能,再复制一个和原来不同引用的HashMap,以满足使用。putMapEntries方法也是判断是否需要扩容重新指定阈值一系列操作,然后遍历那个HashMap中的值再放入到新的HashMap中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值