ArrayList list = new ArrayList(20);中的list扩充几次?牛客网笔试题

ArrayList list=new ArrayList();
这种是默认创建大小为10的数组,每次扩容大小为1.5倍
ArrayList list=new ArrayList(20);
使用的ArrayList的有参构造函数
这里写图片描述
这种是指定数组大小的创建,创建时直接分配其大小,没有扩充。
一次性为创建了传入的数字的长度的数组
所以,扩充为0次

### Java ArrayList 初始化容量为20时的扩容分析 在 Java 中,`ArrayList` 的扩容机制是一个重要的性能考量因素。当 `ArrayList` 的元素数量超出其当前容量时,会触发扩容操作。根据已知的信息[^4],`ArrayList` 默认初始容量为 10,并且每次扩容后的新容量为其原容量的 1.5 倍。 如果初始化一个容量为 20 的 `ArrayList`,则该集合的初始容量设置为 20。随后,随着元素不断添加,一旦元素数量超过了当前容量,就会发生扩容行为。以下是具体计算过程: --- #### 扩容规则 - 当前容量不足以容纳新元素时,`ArrayList` 将其容量调整为原来的 **1.5 倍**。 - 新容量通过以下公式计算: \[ \text{newCapacity} = (\text{oldCapacity}) + ((\text{oldCapacity}) / 2) \] --- #### 计算扩容次数 假设我们需要向此 `ArrayList` 添加 \( n \) 个元素,则扩容次数取决于 \( n \) 和初始容量的关系。下面列举一些常见情况下的扩容次数: 1. **初始容量:20** - 如果添加的元素总数不超过 20,则无需扩容。 2. **首次扩容** - 当元素数量超过 20 时,触发第一次扩容。 - 新容量为: \[ 20 + (20 / 2) = 30 \] 3. **第二次扩容** - 若继续添加元素直到超过 30,则再次触发扩容。 - 新容量为: \[ 30 + (30 / 2) = 45 \] 4. **第三次扩容** - 继续添加元素直至超过 45,则触发第三次扩容。 - 新容量为: \[ 45 + (45 / 2) = 67 \] 以此类推,每轮扩容后的容量均为上一轮容量的 1.5 倍。 --- #### 示例代码 以下是一段用于验证扩容逻辑的代码示例: ```java import java.util.ArrayList; public class ArrayListExpansionTest { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(20); // 设置初始容量为20 int size = 0; while (true) { try { list.add(size++, Integer.valueOf(1)); } catch (OutOfMemoryError e) { break; } if (size % 10 == 0 || size == 21 || size == 31 || size == 46) { // 关键点打印 System.out.println("Size: " + size + ", Capacity: " + getCapacity(list)); } } } private static int getCapacity(ArrayList<?> list) { return Math.max((int)(list.size() * 1.5), list.size()); } } ``` 注意:上述代码仅作为演示用途,实际生产环境中应避免频繁扩容以提升性能。 --- ### 总结 对于初始化容量为 20 的 `ArrayList`,扩容的具体次数依赖于最终添加的总元素数量 \( n \)。例如: - 如果 \( n = 50 \),则会发生两次扩容(分别达到容量 30 和 45)。 - 如果 \( n = 100 \),则至少需要三次扩容(依次达到容量 30、45 和 67)。 为了减少不必要的扩容开销,建议提前估算所需存储的数据量并合理设定初始容量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值