Java8 HashMap之tableSizeFor
Java8对许多内置的容器进行了优化与拓展,其中对HashMap的改变尤其大。之后将进行总结。
最近在看HashMap的源码时,发现了里面好多很不错的算法,相比Java7从性能上提高了许多。其中tableSizeFor就是一个例子。tableSizeFor的功能(不考虑大于最大容量的情况)是返回大于输入参数且最近的2的整数次幂的数。比如10,则返回16。该算法源码如下:
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位操作部分:先来假设n的二进制为01xxx...xxx。接着
对n右移1位:001xx...xxx,再位或:011xx...xxx
对n右移2为:00011...xxx,再位或:01111...xxx
此时前面已经有四个1了,再右移4位且位或可得8个1
同理,有8个1,右移8位肯定会让后八位也为1。
综上可得,该算法让最高位的1后面的位全变为1。
最后再让结果n+1,即得到了2的整数次幂的值了。
现在回来看看第一条语句:
int n = cap - 1;
让cap-1再赋值给n的目的是另找到的目标值大于或等于原值。例如二进制1000,十进制数值为8。如果不对它减1而直接操作,将得到答案10000,即16。显然不是结果。减1后二进制为111,再进行操作则会得到原来的数值1000,即8。
这种方法的效率非常高,可见Java8对容器优化了很多,很强哈。其他之后再进行分析吧。
转载于:https://www.cnblogs.com/loading4/p/6239441.html
Java8 HashMap之tableSizeFor相关推荐
- Java8 HashMap详解
文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 ###Java8 HashMap Java8 对 HashMap 进行了一些修改,最大的不同就 ...
- Java8 HashMap 扩容之后旧元素存放位置
Java8 HashMap 扩容之后旧元素存放位置 根据源码可看出,java 在扩容的时候会新建一个新的 Node<K,V>[] 来存放扩容之后的值,并将旧有的Node数组置空: 至于旧有 ...
- Java8 HashMap实现原理探究
2019独角兽企业重金招聘Python工程师标准>>> 前言:Java8之后新增挺多新东西,在网上找了些相关资料,关于HashMap在自己被血虐之后痛定思痛决定整理一下相关知识方便自 ...
- Java8 HashMap源码分析
前言 今天,我们主要来研究一下在Java8中HashMap的数据结构及一些重要方法的具体实现. 研究HashMap的源代码之前,我们首先来研究一下常用的三种数据结构:数组.链表和红黑树. ...
- Java8 HashMap 扩容机制与线程安全分析
如果大家有仔细阅读过 HashMap 的源码就会发现 HashMap 的哈希表初始化并不是在其构造函数中进行的,而是 resize() 方法. 这篇文章不对 HashMap 中的树进行介绍. 一.Ha ...
- HashMap方法tableSizeFor解析
版权声明:本文为CSDN博主「塔奇库玛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/qq_35296366 ...
- Java8 HashMap
2019独角兽企业重金招聘Python工程师标准>>> Java为数据结构中的映射定义了一个接口java.util.Map 此接口主要有四个常用的实现类,分别是HashMap. Ha ...
- java8 hashmap 死循环_踩坑了,JDK8中HashMap依然会死循环!
作者:Aaron_涛 原文:blog.csdn.net/qq_33330687/article/details/101479385 是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽 ...
- HashMap之tableSizeFor
https://www.cnblogs.com/loading4/p/6239441.html
最新文章
- a different object with the same identifier value was already associated with the session解决方案
- 〔转〕Word域的应用和详解10_域的应用例子
- issubclass和isinstance 反射 内置方法(魔术方法)
- VC++源码分析 - 中国象棋源码分析
- express-winston 库的学习笔记
- Leetcode 5. 最长回文子串(Longest Palindromic Substring)
- 找不到天隆虚拟机_玩转虚拟机,教你如何装系统
- java 蓝桥杯 数字游戏
- Oracle 写存储过程的一个模板还有一些基本的知识点
- 新浪推荐 二面 移动零
- Windows Server 2003 R2标准版 SP2 64位 (简体中文)官方原版ISO镜像
- iOS 开发获取字体类型
- 怎样统计PPT演示文稿的字数
- 哈工大计算机考研复试考纲,哈尔滨工业大学考研复试大纲
- Netty之线程唤醒wakeup
- ASPCMS插件,批量ASPCMS采集发布插件
- 谜底是计算机病毒的谜语,有关于安全的谜语及谜底答案解析|谜底是粽子的谜语...
- 银行计算机岗社会招聘考什么题目,2020各大银行科技岗招聘考试考试内容是什么?...
- 减一技术实现求a的n次幂
- 期货客户开户手续费(期货开户最低手续费)
热门文章
- c++ 结构体中不同类型的初始值_不同类型结构的厂房效果图大盘点
- python︱Python进程、线程、协程详解、运行性能、效率(tqdm)
- java笔记高级部分
- zyplayer-doc 1.0.1 发布,你家所需的文档管理工具他都承包了!
- Python多版本管理
- 存数字,储未来——新华三2018存储瞄准闪存、海量、AI与超融合
- linux系统管理常用命令--top
- 60个有用CSS代码片段
- Android入门学习2
- 【DM642学习笔记一】关于Can't Initialize Target CPU的一种解决方法 : Error 0x80000240