jdk8 HashMap tableSizeFor
2019-12-14 16:04:19来源:博客园 阅读 ()
jdk8 HashMap tableSizeFor
今天读jdk8 HashMap源码,构造函数中 根据initialCapacity初始化threshold
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);//大于initialCapacity的最小的2的幂
}
其中tableSizeFor 函数看的一脸懵,记录一下
/** * Returns a power of two size for the given target capacity. * 取大于capacity的最小的2的幂 */ static final int tableSizeFor(int cap) { int n = cap - 1;//防止cap正好是2的幂的情况下扩大cap,进行cap<<1的情况 n |= n >>> 1;//保证n的高位前2位全是1(如果n的第一个1出现在大于第1位的位置,最低位是第0位) n |= n >>> 2;//保证n的高位前4位全是1(如果n的第一个1出现在大于第3位的位置) n |= n >>> 4;//保证n的高位前8位全是1(如果n的第一个1出现在大于第7位的位置) n |= n >>> 8;//保证n的高位前16位全是1(如果n的第一个1出现在大于第15位的位置) n |= n >>> 16;//保证n的高位前32位全是1(如果n的第一个1出现在大于第31位的位置) /** * 经过或运算后 n是低位全是1的值(如0000 0001 1111 1111),n+1后变成高位进1,低位全是0(0000 0010 0000 0000),正好是2的幂 */ return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
原文链接:https://www.cnblogs.com/fengyanqing/p/12041011.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:可扩展的Java线程池执行器
- HashMap:源代码(构造方法、put、resize、get、remove、rep 2020-06-04
- HashMap1.7和1.8,红黑树原理! 2020-06-03
- JDK8的JVM内存模型小结 2020-06-03
- JDK1.7和1.8的HashMap对比详解 2020-06-02
- HashMap理解 2020-05-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash