今天读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;
}
 

jdk8 HashMap tableSizeFor的更多相关文章

  1. hashMap tableSizeFor 实现原理

    基于jdk1.8 hashMap实现,要求容量大小是2的整次方,例如:2/4/8/16/32/64/128...,而不能是中间的某个值.这是为什么呢? map是数组+链表的数据结构,读写数据都需要首先 ...

  2. JDK8 HashMap 源码解析

    HashMap中数据结构 在jdk1.7中,HashMap采用数组+链表(拉链法).因为数组是一组连续的内存空间,易查询,不易增删,而链表是不连续的内存空间,通过节点相互连接,易删除,不易查询.Has ...

  3. JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路

    JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起   ...

  4. 【1】JDK8 HashMap扩容优化

    JDK1.7 VS JDK1.8 比较 优化概述: resize 扩容优化 引入了红黑树,目的是避免单条链表过长而影响查询效率 解决了resize时多线程死循环问题,但仍是非线程安全的 这里主要讲讲扩 ...

  5. Jdk8 Hashmap ConcurrentHashMap

    JDK1.8 Hashmap JDK1.8 ConcurrentHashMap 不采用segment而采用 synchronized (f)  f = table[i]; 减小锁的力度 设计了MOVE ...

  6. jdk8 hashmap 链表resize 源码分析

    重点看这部分代码 for (int j = 0; j < oldCap; ++j) { Node<K,V> e; if ((e = oldTab[j]) != null) { old ...

  7. HashMap实现原理及源码分析之JDK8

    继续上回HashMap的学习 HashMap实现原理及源码分析之JDK7 转载 Java8源码-HashMap  基于JDK8的HashMap源码解析  [jdk1.8]HashMap源码分析 一.H ...

  8. HashMap 源码赏析 JDK8

    一.简介 HashMap源码看过无数遍了,但是总是忘,好记性不如烂笔头. 本文HashMap源码基于JDK8. 文章将全面介绍HashMap的源码及HashMap存在的诸多问题. 开局一张图,先来看看 ...

  9. Java集合中的HashMap类

    jdk1.8.0_144 HashMap作为最常用集合之一,继承自AbstractMap.JDK8的HashMap实现与JDK7不同,新增了红黑树作为底层数据结构,结构变得复杂,效率变得更高.为满足自 ...

随机推荐

  1. 【win10】通过环境变量来快速打开应用程序

    step1:建一个空文件夹,并把文件夹路径复制到剪贴板. step2:依次右键点击“此电脑”.属性.高级系统设置.环境变量,定位到“系统变量”,点击新建. (说明:环境变量分为用户变量和系统变量,用户 ...

  2. css利用padding-top设置等比例遇到的问题

    外层盒子如果设置了左右margin,外层盒子设置对应比例的时候,是按外层盒子的宽+两边的margin算做横向总长度的,不是只算宽度的.

  3. docker镜像管理(二)

    docker镜像 docker镜像含有启动容器所需要的文件系统和内容,因此,其用于创建并启动docker容器 docker镜像采用分层构建机制,最底层为bootfs,其之为rootfs bootfs: ...

  4. 深度自编码器(Deep Autoencoder)MATLAB解读

    深度自编码器(Deep Autoencoder)MATLAB解读 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 这篇文章主要讲解Hinton在2006 ...

  5. JavaScript显式类型转换与隐式类型转换

    隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...

  6. Html学习之十二(CSS选择器的应用二)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. golang 服务端和客户端(二)

    1.golang服务端 package main import( "net/http" ) func main(){ //注册处理函数,用户连接,自动调用指定的处理函数 http. ...

  8. 【Ribbon篇四】Ribbon核心组件IRule(3)

    Ribbon在工作时分为两步: 先选择 EurekaServer,它优先选择在同一个区域内负载较少的Server: 再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址: 其中Rib ...

  9. LG2996 「USACO10NOV」Visiting Cows

    问题描述 LG2996 题解 和没有上司的舞会双倍经验? \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; te ...

  10. 解决VMware15 centos7 桥接模式ssh突然不能访问的问题

    因为想让虚拟机拥有自己的局域网IP, 所以用了桥接, 这样方便测试. 问题来了: 1.ssh突然连接不上了,虚拟机上的项目也无法访问了. 2.虚拟机照常联网,与主机互ping什么的也都没问题,以前从来 ...