当前位置: 首页 > news >正文

HashMap中的tableSizeFor(int cap)

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;
    }

主要功能:返回一个大于等于且最接近 cap 的2的幂次方整数,如给定9,返回2的4次方16。

这个算法的大致原理:
假定cap也就是给定数的的形式为00…01XXXXXXX,(X代表可为0也可为1,X前面的1为从最高位开始第一个为1的那一位)
第一步: n |= n >>> 1; 也就是n变为n与n右移一位之后异或后的值,即
n: 00…01XXXXXXX
n>>>1: 00…001XXXXXX
新n: 00…011XXXXXX
第二步: n |= n >>> 2; 也就是n变成n与n右移两位之后异或的值,即
n: 00…011XXXXXX
n>>>2: 00…00011XXXX
新n: 00…01111XXXX
后面相类似。

这个算法不断地把第一个1后面的位全部变成1。本例由00…01XXXXXXX —> 00…011111111,最后再返回n+1(2的幂次方);

相关文章:

  • Jdk1.8-HashMap put() 方法tab[i = (n - 1) hash] 解惑
  • JDK1.8源码 resize()解析
  • HashMap中的迭代器
  • Hashtable中的get(key)方法,为什么进行hash 0x7FFFFFFF
  • Hashtable中的rehash()方法
  • mysql查询一个时间段的数据
  • Linux中的shell是什么
  • JUC笔记
  • 共享模型之管程
  • 共享模型之内存
  • 共享模型之无锁
  • 全面解析ThreadLocal
  • BIO-NIO-AIO笔记
  • docker 运行出错 Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/007
  • JAVA多态
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • cookie和session
  • Java程序员幽默爆笑锦集
  • node和express搭建代理服务器(源码)
  • Python语法速览与机器学习开发环境搭建
  • ReactNative开发常用的三方模块
  • Spring核心 Bean的高级装配
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue 重置组件到初始状态
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 手写双向链表LinkedList的几个常用功能
  • 新版博客前端前瞻
  • 一些css基础学习笔记
  • 自制字幕遮挡器
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 带你开发类似Pokemon Go的AR游戏
  • 如何正确理解,内页权重高于首页?
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ###C语言程序设计-----C语言学习(3)#
  • #NOIP 2014# day.1 T2 联合权值
  • (1)(1.9) MSP (version 4.2)
  • (9)目标检测_SSD的原理
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (一)80c52学习之旅-起始篇
  • (转)四层和七层负载均衡的区别
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .Family_物联网
  • .Net Web窗口页属性
  • .net 微服务 服务保护 自动重试 Polly
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET性能优化(文摘)
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • :not(:first-child)和:not(:last-child)的用法
  • @ComponentScan比较
  • @TableLogic注解说明,以及对增删改查的影响
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [AIGC] Kong:一个强大的 API 网关和服务平台