hashMap的哈希值(散列表值)获取的方式是:获取hashCode
并与 hashCode
左移16位 做异或运算 , 得出的值再和 hashMap
的散列表数组长度 做&
与运算 ,得出hashMap
key对应的 散列表值
java 中的hashCode
值针对这个java Object
的, jvm
每new
一个Object
都会把 这个object
丢到一个散列表中
后面获取/做对比这个object
对象 再根据这个hashCode
值 从Hash表(散列表)那处理
0.75
这个是填装因子 HashMap 底层思想是散列表 哈希表)
散列表 给一个标识 key 通过散列函数 计算出 数组索引
不同的key 散列函数返回相同的值 ,这种情况属于冲突, 好的散列表应该是避免冲突的 其中避免方法之一是:设置较低的填装因子 (散列表包含的元素 除于 位置总数) 12/16 =0.75
填装因子越低 发生冲突的可能性越小
所以 散列表 填装因子超出 0.75 就开始扩容
public class SomeThing11 {
public static void main(String[] args) {
int i = 0;
Map<Integer,ArrayList<String>> oldMap = new HashMap<>();
do{
// 我这里设置 散列表长度为64
getMapArrIndex(64,String.valueOf(i),oldMap);
}while (++i < 10000);
Map<Integer,ArrayList<String>> newMap = new HashMap<>();
for (Integer index : oldMap.keySet()) {
if (oldMap.get(index).size() >=8) {
newMap.put(index,oldMap.get(index));
}
}
newMap.get(0);
}
/**
* 这里取的hashMap 数组长度为默认长度16
* 如何要设置其他的 可设置为变量
* @param key 为 hashMap 索引值相同的key集合
* @param map Map> key为模拟hashmap 得出的数组索引下标值,value 为 hashMap 索引值相同的key集合
*/
public static void getMapArrIndex(int tableLength,String key,Map<Integer, ArrayList<String>> map){
int n =(16 - 1) & hash(key);
if (!map.containsKey(n)) {
map.put(n,new ArrayList<String>());
}
map.get(n).add(key);
}
/**
* HasMap key的hashMap hash值
* @param key
* @return
*/
static int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
}