1. ArrayList的扩容规则
ArrayList 是 Java 自带的动态数组容器,支持自动扩容。当在 arrayList 中添加元素时,如果当前的数组容量已满,则需要进行扩容。ArrayList 的默认初始容量是 10,扩容因子是 1.5 倍。也就是说,在当前容量满载时,会将容量扩大到 1.5 倍。
下面是 ArrayList 的扩容规则:
- 当添加元素时,如果元素数量等于容量,就会发生扩容,将容量扩大为当前容量的 1.5 倍;
- 如果当前容量不足以存储所有元素,则创建一个新的数组,并将原数组中的元素移动到新数组中;
- 新数组的容量将是原数组容量的 1.5 倍,或者是当前元素数量(即最小容量)的两者中较大的那个。
示例一:当 ArrayList 中的元素数量达到容量时发生扩容
List<Integer> list = new ArrayList<>(10); // 默认容量为10
for(int i=0;i<=10;i++) {
list.add(i);
}
当添加第 11 个元素后,ArrayList 会扩容,将容量变为 10 的 1.5 倍,即 15。此时 list 的容量为 15。
示例二:当元素数量高于容量最小值时,扩容为元素数量的两者中较大的那个
List<Integer> list = new ArrayList<>(3); // 自定义初始容量为3
// 添加5个元素到ArrayList中
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
在这个示例中,ArrayList 的初始容量为 3,但是添加 5 个元素后,它的容量不足以容纳所有元素,因此会扩容为 5 的 1.5 倍,即 7。所以,list 的容量为 7。
2. HashMap 的扩容规则
HashMap 是一个散列表,它存储键值对。当 HashMap 中的元素数量超过其容量乘以负载因子时(默认值为 0.75),它就会自动扩容。扩容后,所有的元素都需要重新计算它们的哈希值,然后重新插入到新的桶中。
下面是 HashMap 的扩容规则:
- 扩容因子取决于初始容量和负载因子;
- 当元素数量超过容量乘以负载因子时,就会自动扩容;
- 扩容后的容量是原来的两倍,但是容量必须是 2 的倍数,以使散列函数可以有效地分布元素到新的和旧的哈希桶中。
示例一:HashMap 扩容因子对容量的影响
Map<String, String> map = new HashMap<>(10, 0.6f);
在这个示例中,我们设置了初始容量为 10,负载因子为 0.6。此时,HashMap 容量的大小为 16。如果元素数量超过 16*0.6 = 9,就会自动扩容。
示例二:HashMap 扩容的影响
Map<String, String> map = new HashMap<>(4, 0.75f);
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("d", "4");
在这个示例中,我们设置了初始容量为 4,负载因子为 0.75。当我们向 map 中添加第 5 个元素时,map 会自动扩容为原来的两倍,即容量为 8。此时,map 中所有的元素都需要重新计算哈希值,并重新插入到新的哈希桶中。在此之后,map 的容量为 8。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ArrayList及HashMap的扩容规则讲解 - Python技术站