如何保证HashMap不重建Hash表
在《阿里巴巴java开发规约》里面,有推荐在初始化HashMap的时候指定初始化长度,尤其是已经知道结果的key数量的时候
当元素个数 >= initialCapacity * loaderFactor
的时候,HashMap就会自行进行扩容到 大于当前容量的下一个 2 的幂,重建 Hash表会影响性能,那么如何保证Hash表不被重建呢? 先看一段代码。
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class HashMapTest {
public static void main(String[] args) throws Exception {
//假设我们知道返回结果的元素个数为 100,即可这样写代码
int num = 10;
// HashMap 的负载因子默认为 0.75
float loadFactor = 0.75f;
Map<String, Object> map = new HashMap<String,Object>((int)(num/0.75f),loadFactor);
//使用反射机制查看 capacity 属性
Class<?> mapType = map.getClass();
Method capacity = mapType.getDeclaredMethod("capacity");
capacity.setAccessible(true);
int times = num;
for (int i=0;i< times;i++){
map.put(""+i,i);
System.out.println("capacity "+i+":"+capacity.invoke(map));
}
}
}
输出结果
capacity 0:16
capacity 1:16
capacity 2:16
capacity 3:16
capacity 4:16
capacity 5:16
capacity 6:16
capacity 7:16
capacity 8:16
capacity 9:16
可见,capacity
一直都没变,因此最重要的是初始化时将初始容量设为(int)(num/loadFactor)
即可保证Hash表不被重建。