需求
将不同字符串映射到对应数组,数组不够时自动成倍扩容,比如有一个数组String[4],现在准备将不同的string映射到String[4]上,str5时会自动扩容并重新打散。
str1-->String[3]
str2-->String[0]
str3-->String[2]
str4-->String[1]
方案
- 先使用哈希运算,比如用
murmurhash3_x86_32
算法得到一个32位的值a。 - 再用一个掩码取得数组下标,这个掩码可用数组长度-1,比如原始数组长度为4,则掩码为3,3的二进制即为11,与上面的哈希值a做&运算即能得到一个4以内的数b。
- 通过掩码计算出来的值可能会重复,所以可以加个判断,比如对于字符串str2,当所计算的值b数组元素不为空且又不等于str2时,则说明这个坑已经被其他字符串占用了,可以往上一个试试。
while(String[b]!=null && !String[b].equals(str2)){
b++;
}
if(String[b]==null)
String[b]=str2;
- 使用一个变量count用于计算已经使用了多少个坑,当count等于数组一半时就进行扩容,比如扩容到8,这时使用的新掩码为7,二进制即111。