HashMap源码中一个算法tableSizeFor

阅读JDK1.8版本HashMap源码看到的一段代码,返回大于等于指定入参的最小2的幂。

 1     /**
 2      * The maximum capacity, used if a higher value is implicitly specified
 3      * by either of the constructors with arguments.
 4      * MUST be a power of two <= 1<<30.
 5      */
 6     static final int MAXIMUM_CAPACITY = 1 << 30;
 7
 8     /**
 9      * Returns a power of two size for the given target capacity.
10      */
11     static final int tableSizeFor(int cap) {
12         int n = cap - 1;
13         n |= n >>> 1;
14         n |= n >>> 2;
15         n |= n >>> 4;
16         n |= n >>> 8;
17         n |= n >>> 16;
18         return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
19     }

int n = cap-1;防止入参本身为2的幂,若不进行减一操作,结果将得到本身的2倍;

原文地址:https://www.cnblogs.com/caster-xzn/p/10225330.html

时间: 2024-11-08 02:04:00

HashMap源码中一个算法tableSizeFor的相关文章

OpenCV 源码中分水岭算法 watershed 函数源码注解

为了研究分水岭算法,阅读了OpenCV 2.4.9 中watershed函数的源码实现部分,代码位于 opencv\sources\modules\imgproc\src\segmentation.cpp 文件中.先贴出加了注解的代码,以后补充对分水岭算法的解释. #include "precomp.hpp" /******************************************************* Watershed **********************

hashMap源码中的一个细节问题

public V put(K key, V value) {        if (key == null)           return putForNullKey(value);        int hash = hash(key.hashCode());         int i = indexFor(hash, table.length);        for (Entry<K,V> e = table[i]; e != null; e = e.next) {        

逐行解读HashMap源码

目录 一.写在前面 Java版本 二.HashMap官方说明 三.HashMap存储结构 四.HashMap静态属性 五.HashMap成员属性 六.HashMap构造方法 七.tableSizeFor(int cap)方法 八.hash(Object key)方法 九.桶下标计算公式 十.put(K key, V value)方法 十一.resize()方法 十二.get(Object key)方法 十三.HashMap序列化与反序列化 十四.treeifyBin(Node[] tab, in

STL源码剖析——STL算法之find查找算法

前言 由于在前文的<STL算法剖析>中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解.本文介绍的STL算法中的find.search查找算法.在STL源码中有关算法的函数大部分在本文介绍,包含findand find_if.adjacent_find.search.search_n.lower_bound. upper_bound. equal_range.binary_search.find_first_of.find_end相关算法,下

Java中HashMap源码分析

一.HashMap概述 HashMap基于哈希表的Map接口的实现.此实现提供所有可选的映射操作,并允许使用null值和null键.(除了不同步和允许使用null之外,HashMap类与Hashtable大致相同)此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap. Map map = Collections.sync

Java中的容器(集合)之HashMap源码解析

1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是一个以键值对存储的容器. hashMap底层实现为数组+链表+红黑树(链表超过8时转为红黑树,JDK7为数组+链表). HashMap会根据key的hashCode得到对应的hash值,再去数组中找寻对应的数组位置(下标). hash方法如下: static final int hash(Object key

Redis源码中探秘SHA-1算法原理及其编程实现

导读 SHA-1算法是第一代"安全散列算法"的缩写,其本质就是一个Hash算法.SHA系列标准主要用于数字签名,生成消息摘要,曾被认为是MD5算法的后继者.如今SHA家族已经出现了5个算法.Redis使用的是SHA-1,它能将一个最大2^64比特的消息,转换成一串160位的消息摘要,并能保证任何两组不同的消息产生的消息摘要是不同的.虽然SHA1于早年间也传出了破解之道,但作为SHA家族的第一代算法,对我们仍然很具有学习价值和指导意义. SHA-1算法的详细内容可以参考官方的RFC:ht

详解Redis源码中的部分快速排序算法(pqsort.c)

看标题,你可能会疑惑:咦?你这家伙,怎么不讲解完整的快排,只讲一部分快排---.- 哎,冤枉."部分快排"是算法的名字,实际上本文相当详细呢.本文几乎与普通快排无异.看懂了本文,你对普通的快排也会有更深的认识了. 快速排序算法(qsort)的原理我们大都应该了解.本文介绍的是部分快速排序算法.其实其算法本质是一样的,只不过限定了排序的左右区间,也就是只对一个数字序列的一部分进行排序,故称为"部分快速排序算法",简称:pqsort Redis项目中的pqsort.c

Go语言源码中的Rabin-Karp算法

strings.go包实现了一个Rabin-Karp算法.有点意思. 关于这个算法: 图灵社区的有一篇: 图说Rabin-Karp字符串查找算法 关于Go源码实现: 网友GoLove已写一个篇非常详细的说明了. http://www.cnblogs.com/golove/p/3234673.html GoLove那个已经分析的非常清楚了,只是前面那一串说明太长了.我把他的说明替换成代码形式. 直接跑起来,这样更能看得清楚些. package main import ( "fmt" &q