HashMap的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; }…
目录 普通人的简单粗暴方式 示例代码 问题 大神的实现 移位的思想 全过程示意图 初始值 右移一位+或运算 右移二位+或运算 右移四位+或运算 右移八位+或运算 右移十六位+或运算 结果+1 初始容量-1 总结 在看HashMap源码时,注意到一个问题,容量必须是2的整数幂,为了保证这一点,专门给出了一个巧妙而高效的方法tableSizeFor.不妨想一下,如果是自己解决这个问题,该怎么解决? 给定一个int类型的整数n,如何求出不小于它的最接近的2的整数幂m,比如给定10得出16,给定25得出…
说明:本文中所谈论的HashMap基于JDK 1.8版本源码进行分析和说明. HashMap的put方法算是HashMap中比较核心的功能了,复杂程度高但是算法巧妙,同时在上一版本的基础之上优化了存储结构,从链表逐步进化成了红黑树,以满足存取性能上的需要.本文逐行分析了put方法的执行流程,重点放在了对整个流程的把握,对于红黑树的执行逻辑只是点到为止,其实HashMap中还有很多细节算法值得分析和学习,本文没有涉及,算是抛砖引玉吧,后面抽空把其他的地方分析一番. 源码阅读与分析 1.HashMa…
tableSizeFor方法 /** * 根据容量参数,返回一个2的n次幂的table长度. */ private static final int tableSizeFor(int c) { int n = c - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n…
我们都知道,对于HashMap来说,数组的容量为2的倍数,但是我们可以在创建map的时候传入一个数组的大小 此时,这个初始化数组大小会传给一个双参的构造器 1. 创建HashMap public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<>(10); } 2. 构造器 public HashMap(int initialCapacity) { this(initialCa…
一次线上问题的解决 线上发现服务cpu使用达到98%,负载高达200多,64核心cpu,下面介绍解决过程: 1.top命令查出占用cpu高的进程pid 2.使用jstack -l pid >dump.txt 获取dump文件 3.使用top -H查询出消耗资源的线程号tid(十进制线程id),转换为16进制 4.cat dump.txt | grep -10 tid(16进制) 查询出该进程号上下10行,定位问题并解决问题 ====================================…
通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接     Connection conn = DriverManager.getConnection(url, user, password); 看得出来,在JDBC中连接被抽象为Connection 表示:与特定数据库的连接(会话) 在连接上下文中执行 SQL 语句并返回结果 方法梗概 对于应用程序开发者来说,连接Connection主要用于执行对象的获取从而进一步执行SQL,这是应用程序与数据…
最近回顾了下HashMap的源码(JDK1.7),当读到putAll方法时,发现了之前写的TODO标记,当时由于时间匆忙没来得及深究,现在回顾到了就再仔细思考了下 @Override public void putAll(Map<? extends K, ? extends V> m) { int numKeysToBeAdded = m.size(); if (numKeysToBeAdded == 0) return; // TODO 这里的numKeysToBeAdded是不是应该要th…
我在看HashMap源码的时候有一个问题让我产生了兴趣,那就是HashMap的keySet方法,没有调用HashMap的有关数据的任何方法就能获取到map的所有的键,他是怎么做到的,然后我就通过模拟keySet方法得到了答案: 下面是代码: package test; import java.util.AbstractSet; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import…
API文档中的描述: 先看一个例子 Map<Character, Integer> map = new HashMap<Character, Integer>(); System.out.println(map.put('a', 0)); // null System.out.println(map.put('a', 1)); System.out.println(map.put('a', 2)); System.out.println(map.put('b', 1)); // n…