HashMap的tableSizeFor算法理解
来源:互联网 发布:xtbl勒索病毒变种java 编辑:程序博客网 时间:2024/06/05 14:41
方法名
tableSizeFor
属于的类:
java.util.HashMap
源码代码:
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;}
修改后方便观察的源码:
static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; System.out.println(Integer.toBinaryString(n)); n |= n >>> 2; System.out.println(Integer.toBinaryString(n)); n |= n >>> 4; System.out.println(Integer.toBinaryString(n)); n |= n >>> 8; System.out.println(Integer.toBinaryString(n)); n |= n >>> 16; System.out.println(Integer.toBinaryString(n)); return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
运行的main方法
public static void main(String[] args) { int a = 65538; System.out.println(Integer.toBinaryString(a)); int i = tableSizeFor(a); System.out.println(i);}
运行后的结果
10000000000000010 11000000000000001 11110000000000001 11111111000000001 11111111111111111 11111111111111111
结果分析:
第一次运行: 10000000000000010 n >>> 1; 01000000000000000 进行|运算 11000000000000001分析: 把最大位的1,通过位移后移一位,并且通过|运算,组合起来第二次运行: 11000000000000001 n >>> 2; 00110000000000000 进行|运算 11110000000000001分析: 把最大的两位,已经变成1的,往后移动两位,并且通过|运算,组合起来第三次运行: 11110000000000001 n >>> 4; 00001111000000000 进行|运算 11111111000000001分析: 把最大4位,已经变成1的,往后移动4位,并且通过|运算,组合起来第四次运行: 11111111000000001 n >>> 8; 00000000111111110 进行|运算 11111111111111111分析: 把最大的8位,已经变成1的,往后移动8位,并且通过|运算,组合起来第五次运算: 同上。因为我的数据,最大只到17位,所有第五次没有效果。可以用32位来进行运算,第五次是通过前16位已经变成1的数据,往后移动16位,然后通过|运算,最后的结果是32位都变成1。第六次运算: hashMap的长度为2的N次方 所有最后的数据格式为1后面N个0的格式 所有最后一步N+1
总结:
前面所有的过程,都是保证造成一个所有位都位1的数据。并且通过最后的+1。变成2N次方格式的数据。
阅读全文
0 0
- HashMap的tableSizeFor算法理解
- HashMap中tableSizeFor的一个精巧的算法
- HashMap方法hash()、tableSizeFor()
- hash函数 hashMap的深入理解,jdk8 hashMap加入红黑树算法
- Hashmap的深入理解
- HashMap个人的理解
- 关于hashmap的理解
- HashMap的一点理解
- HashMap类的理解
- HashMap的transfer理解
- 对于HashMap的理解
- HashMap的理解
- 简要的理解HashMap
- HashMap的进一步理解
- HashMap源码注解 之 静态工具方法hash()、tableSizeFor()(四)
- JDK源码阅读之HashMap -- hash值计算方式、下标查找及tableSizeFor方法
- hashMap算法的实现
- Hashmap的hash算法
- Maven 本地仓库明明有jar包,但是pom文件还是报错解决办法
- 23-树的层次遍历
- IDC机房服务器
- jmeter个人学习之路--jmeter结果分析
- NXP 蓝牙QN902X 协议profile的理解
- HashMap的tableSizeFor算法理解
- 【计组】--数值的机器运算(1): 加法器
- 自定义监听回调
- 手把手教你Spring+SpringMVC+MyBatis工程创建
- Qt 错误出现记录
- 学习java的一个好玩的小程序
- python入门系列10―——Excel操作
- Linux下远程连接MySQL数据库
- 《Java编程思想》学习笔记8——Java new I/O(一)