Java:遍历大小不一致的List对象,避免IndexOutOfBoundsException
嘿,这个动态集合遍历的问题我之前踩过坑,太懂那种突然蹦出IndexOutOfBoundsException的崩溃感了!针对你说的Hello.java返回大小不一致的列表(首次2个元素、第二次3个)的场景,给你几个绝对安全的遍历方案:
方案1:用增强for循环(最省心的选择)
这是Java里遍历集合最简洁安全的方式,完全不用手动管索引,底层靠迭代器帮你处理边界,不管列表是2个还是3个元素,都能完整遍历,绝对不会触发越界异常。
代码示例:
// 假设Hello.java里获取列表的方法是getDynamicList() List<String> dynamicList = Hello.getDynamicList(); for (String item : dynamicList) { System.out.println(item); }
方案2:手动基于当前size遍历(适合需要索引的场景)
如果你必须用到索引值,别写死循环上限,一定要先获取列表当前的实际大小,用这个值作为循环的终止条件:
List<String> dynamicList = Hello.getDynamicList(); // 先拿到当前列表的大小,避免硬编码数字导致越界 int currentSize = dynamicList.size(); for (int i = 0; i < currentSize; i++) { System.out.println("索引" + i + "的元素:" + dynamicList.get(i)); }
⚠️ 注意:如果遍历过程中列表大小会被动态修改(比如其他线程在添加/删除元素),这个方法可能还是会有问题,这时候看方案3。
方案3:用Iterator迭代器(支持遍历中安全修改)
如果你的场景不仅是遍历,还需要在遍历过程中修改列表(比如删除元素),直接用迭代器是最安全的,它会维护集合的修改状态,避免异常:
List<String> dynamicList = Hello.getDynamicList(); Iterator<String> iterator = dynamicList.iterator(); while (iterator.hasNext()) { String item = iterator.next(); System.out.println(item); // 如果需要删除当前元素,一定要用迭代器的remove方法,别直接调用list.remove() // iterator.remove(); }
方案4:多线程场景用并发安全集合
如果列表是在多线程环境下被动态修改的,那建议直接用CopyOnWriteArrayList替代普通的ArrayList,它在遍历时会使用集合的快照,完全不会因为其他线程的修改触发越界或并发修改异常:
// 假设Hello.java返回的是CopyOnWriteArrayList CopyOnWriteArrayList<String> dynamicList = Hello.getDynamicList(); for (String item : dynamicList) { System.out.println(item); }
不管你用上面哪种方案,都能满足你的需求:首次运行打印2个元素,第二次运行打印3个元素,全程不会出现IndexOutOfBoundsException。
内容的提问来源于stack exchange,提问作者Gaming
相关产品推荐
相关产品推荐

