IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 为什么HashMap初始化容量始终是2的指数 -> 正文阅读

[数据结构与算法]为什么HashMap初始化容量始终是2的指数

为什么HashMap初始化容量始终是2的指数

1.初始化容量规律

? 最近刷到一个面试题,问HashMap为了保证散列分布,其容量都是2的指数倍,那如果初始化容量为15怎么办?还会是2的指数倍吗?

? 因此去阅读了一下源码,发现传递初始化容量创建HashMap时,会调用另外一个构造方法,如下:

//带有初始化容量的构造方法
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;
    	//请注意看这个方法,tableSizeFor(initialCapacity)
        this.threshold = tableSizeFor(initialCapacity);
    }

//tableSizeFor方法,会对传过来的初始化容量进行以下计算
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;
    }

? 可以通过上面的代码得知,我们传进入的初始化容量并不是直接就会被赋到真正的数组容量当中,而是进行了一系列计算得到最终的初始化容量,可以总结为以下规律:

  • 当传入初始化容量N<2的指数倍,最终初始化容量就是离N最近且大的那个数

    ? 比如传进来15,那么最终的初始化容量就是16

  • 当传入初始化容量N=2的指数倍,最终初始化容量就是N本身

    ? 比如传进来16,那么最终的初始化容量就是16

2.二进制探究初始化容量规律

? 对于以上初始化容量的计算机制,在二进制层面进行剖析:

当传入的初始化容量<2的指数倍时
在这里插入图片描述

当传入的初始化容量=2的指数倍时
在这里插入图片描述

当传入的初始化容量=2的指数倍+1时
在这里插入图片描述

3.总结

? 根据以上信息得知,在给HashMap传入初始化容量N时,底层总是会将N和其右移数的二进制进行或运算,最终总能得出一个全为1的二进制数,然后进行加1,得到2的指数倍的最终容量。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:50:47  更:2022-03-10 22:54:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:30:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码