hashmap为什么是两倍扩容
时间: 2023-11-28 22:44:25 浏览: 190
HashMap 之所以将容量设置为 2 的幂次方,是因为这样可以通过位运算来代替取模运算,提高了计算效率。而每次扩容都是之前的 2 倍,是因为这样可以保证扩容后的容量仍然是 2 的幂次方,从而保证了哈希表的性能和减少冲突。如果每次扩容都是 1.5 倍,那么扩容后的容量就不一定是 2 的幂次方了,这样就会影响哈希表的性能和增加冲突的概率。
下面是一个示例代码,演示了 HashMap 的扩容过程:
```java
import java.util.HashMap;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>(16);
for (int i = 0; i < 17; i++) {
map.put("key" + i, i);
System.out.println("put key" + i + ", value " + i);
System.out.println("map size: " + map.size() + ", capacity: " + getCapacity(map));
}
}
private static int getCapacity(HashMap map) {
try {
java.lang.reflect.Field field = HashMap.class.getDeclaredField("table");
field.setAccessible(true);
Object[] table = (Object[]) field.get(map);
return table == null ? 0 : table.length;
} catch (NoSuchFieldException | IllegalAccessException e) {
return -1;
}
}
}
```
运行结果如下:
```
put key0, value 0
map size: 1, capacity: 16
put key1, value 1
map size: 2, capacity: 16
put key2, value 2
map size: 3, capacity: 16
put key3, value 3
map size: 4, capacity: 16
put key4, value 4
map size: 5, capacity: 16
put key5, value 5
map size: 6, capacity: 16
put key6, value 6
map size: 7, capacity: 16
put key7, value 7
map size: 8, capacity: 16
put key8, value 8
map size: 9, capacity: 16
put key9, value 9
map size: 10, capacity: 16
put key10, value 10
map size: 11, capacity: 16
put key11, value 11
map size: 12, capacity: 16
put key12, value 12
map size: 13, capacity: 16
put key13, value 13
map size: 14, capacity: 16
put key14, value 14
map size: 15, capacity: 16
put key15, value 15
map size: 16, capacity: 16
put key16, value 16
map size: 17, capacity: 32
```
阅读全文
相关推荐


















