
本文解析IndexOutOfBoundsException异常的根本原因,指出对空ArrayList调用set()会导致越界,并提供安全、高效的列表填充方案。
本文解析`indexoutofboundsexception`异常的根本原因,指出对空arraylist调用`set()`会导致越界,并提供安全、高效的列表填充方案。
在Java开发中,java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 是一个常见却易被忽视的运行时异常。它并非源于数组索引越界,而是对尚未填充元素的 ArrayList 调用 set(int index, E element) 方法所致。
回顾原始代码问题核心:
List<Boolean> res = new ArrayList<Boolean>(candies.length); // ⚠️ 仅预分配容量,size仍为0 // ... res.set(i, true); // ❌ 报错:索引0超出当前有效长度(即size=0)
ArrayList(int initialCapacity) 构造函数仅设置内部数组的初始容量(capacity),而非列表的实际大小(size)。此时 res.size() 为 0,而 set() 要求索引 i 必须满足 0 ≤ i —— 因此首次调用 <code>res.set(0, ...) 即触发 IndexOutOfBoundsException。
✅ 正确做法是使用 add() 方法逐个追加元素,它会自动维护 size 并在必要时扩容:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
if (candies == null || candies.length == 0) {
return new ArrayList<>(); // 防御空输入
}
// 优化:仅需一次排序 + 一次遍历;计算阈值 max - extraCandies 避免重复加法
Arrays.sort(candies);
int threshold = candies[candies.length - 1] - extraCandies;
List<Boolean> result = new ArrayList<>(candies.length); // 预设容量提升性能
for (int candy : candies) {
result.add(candy >= threshold); // ✅ 使用 add() 安全填充
}
return result;
}? 关键要点总结:
-
set(i, e)用于替换已存在索引i处的元素,要求i必须合法(即i ); -
add(e)用于追加新元素,自动增长size,是初始化空列表的首选; - 预分配容量(如
new ArrayList(n))可避免多次扩容开销,但不改变初始size; - 建议增加空数组/空输入校验,增强鲁棒性;
- 逻辑上,判断“能否成为最多”等价于
candy + extraCandies >= max,变形为candy >= max - extraCandies可避免循环内重复计算。
掌握 ArrayList 的 size 与 capacity 区别,是规避此类越界错误的关键基础。

















