/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
}
这个方法有点意思,主要作用是定位hashmap里的bucket。
-------------------------------------------------------
大家知道hashmap底层就是一个数组,然后数组里每个元素装了个链表。
这个数组元素称为bucket桶
-------------------------------------------------------
先复习一下逻辑与。
0 & 0 = 0;
0 & 1 = 0;
1 & 0 = 0;
1 & 1 = 1;
第二个参数length始终为2的n次方,所以,
换成二进制数就是 100,1000,10000,...
(length -1)就是 11, 111,1111,...
这样的话,
第一个参数h比第二个参数小的情况下,那结果就是h。
第一个参数h比第二个参数大的情况下,如下:
例:
h=18 -> 10010
length-1=15 -> 01111
10010
01111
-------
00010 (即2)
也就是h-length,
假设 h=5,length=16, 那么 h & length - 1 将得到 5;如果 h=6,length=16, 那么 h & length - 1 将得到 6 ……如果 h=15,length=16, 那么 h & length - 1 将得到 15;但是当 h=16 时 , length=16 时,那么 h & length - 1 将得到 0 了;当 h=17 时 , length=16 时,那么 h & length - 1 将得到 1 了
这样就能保证取得合理的索引值。
参考blog:http://alex09.iteye.com/blog/539545
分享到:
相关推荐
indexFor 方法是用于计算键值对在数组中的索引的方法。该方法将 Hash 码和数组的长度作为输入,并返回一个索引值。indexFor 方法非常巧妙,它可以将 Hash 码映射到数组中的索引处,从而实现了键值对的快速查找。 ...
为了找到对应的数组位置,HashMap使用了indexFor()方法,该方法通过将散列值与数组长度减一进行按位与操作来得到索引值: ```java static int indexFor(int hash, int length) { return hash & (length - 1); } ``...
static int indexFor(int h, int length) { return h & (length - 1); } ``` 这里的`length`是指数组的长度,必须是2的幂。例如,数组长度为16时,`length - 1`等于15,即二进制表示为`1111`。哈希值与`1111`进行...
首先,你需要创建一个HashMap的实例,然后可以使用`put`方法添加数据,用`get`方法检索数据,用`remove`方法删除数据,用`each`方法遍历数据,最后可以通过`toString`方法将数据转换为字符串。 ### 4. 注意事项 ...
当插入元素时,HashMap会计算key的hashCode,通过hash()函数转化为一个哈希值,再通过indexFor()函数确定在数组中的索引位置。如果该位置已有元素,新元素将被添加到链表中。在获取值时,HashMap同样根据key的...
### AC自动机详解 #### 一、AC自动机概述 AC自动机,全称为Aho-Corasick自动机,是一种高效的多模式字符串匹配算法。它由Alfred V. Aho和Margaret J. Corasick在1975年提出,并在贝尔实验室首次发布。AC自动机主要...
5. **字符串操作**:熟悉String类的常用方法,如concatenation、substring、indexOf等,并理解字符串是不可变的。 6. **多线程**:学习如何创建和控制线程,理解线程同步机制,如synchronized关键字、wait()、...
for (PersonType type : PersonType.values()) { enumMap.put(type.getValue(), type); } } public static PersonType getEnum(String value) { return enumMap.get(value); } } ``` 现在,我们需要创建一...
其中,`Maps.uniqueIndex()`方法可以方便地将列表转换为Map,其接受一个列表和一个函数(Function)作为参数,函数用于提取列表元素的键。以下是使用Guava的示例: ```java List<Movie> movies = Lists.new...
7. **字符串处理**:熟悉String类的常用方法,如substring、indexOf、replace等。 在准备Java二级考试时,考生应重视实战练习,不断巩固理论知识,同时通过模拟上机环境,反复操练编程,以提高应对考试的能力。...
- **String类**:不可变性、字符串连接、indexOf、substring等方法的使用。 - **StringBuilder和StringBuffer**:在需要频繁修改字符串时的高效选择。 6. **输入/输出流**: - **File类**:文件的创建、删除、...
List 集合的特有方法有:add(index, value) 在 index 位置添加值,remove(index) 移除 index 位置的值,set(index, value) 将 index 位置的值替换为 value,get(index) 获取指定索引处的值。 Set 集合的特点是散列...
Android SDK中的一些方法,如String的indexOf()和lastIndexOf(),是用C语言编写的,执行效率高于Java方法。因此,在可能的情况下,优先使用这些原生方法。 在选择数据结构时,考虑使用实现类而非接口。虽然接口提供...
使用Ibatis的批处理,首先需要开启SqlSession的自动提交,然后调用SqlSession的batch()方法进入批处理模式,接着执行多次insert、update或delete操作,最后调用commit()方法提交事务。这种方式避免了频繁的数据库...
##### HashMap转List方法 ```java public static List getList(HashMap hs) { List list = new ArrayList(); Iterator itr = hs.keySet().iterator(); while (itr.hasNext()) { list.add(hs.get(itr.next())); ...
### Java面试知识点详解 #### 一、Java特点 **Java是一种高级编程语言,具有以下特点:** 1. **简单性:** Java设计时考虑到了初学者的需求,语法结构清晰且易于理解。 2. **面向对象:** Java完全支持面向对象编程...
在这个`same`方法中,我们首先创建了一个HashMap,键(key)为列表中的元素,值(value)为该元素首次出现的位置索引。遍历列表时,如果发现某个元素已经在map中存在(即`old != null`),则将当前索引与已存在的...