为何Iterator循环中'Mary'消失?Java集合遍历异常排查
为什么Iterator遍历ArrayList时'Mary'看似消失但实际没被删除?
让我来帮你拆解这个问题——你遇到的不是'Mary'被删除了,而是你的Iterator遍历逻辑里重复调用了next()方法,导致直接跳过了'Mary'的输出!
问题根源分析
先看你这段Iterator遍历的核心代码:
while (iterator.hasNext()){ System.out.println(iterator.next()); // 第一次调用next() if (iterator.next().equals("Nick")){ // 第二次调用next() iterator.remove(); } }
Iterator的next()方法有个关键特性:每次调用都会把内部指针移动到下一个元素,而不是停留在当前元素。我们一步步走一遍执行流程,就能清楚看到问题:
- 初始状态:Iterator指针位于第一个元素(John)的前面。
- 第一次进入循环:
- 调用
iterator.next(),指针移动到John,输出"John"。 - 紧接着再次调用
iterator.next(),指针直接跳到Mary,判断是否等于"Nick"?显然不成立,所以不执行删除操作。
- 调用
- 第二次进入循环:
- 调用
iterator.next(),指针移动到George,输出"George"。 - 再次调用
iterator.next(),指针跳到Nick,判断等于"Nick",执行iterator.remove(),把Nick从列表中删除。
- 调用
- 第三次检查
hasNext():此时指针已经到了列表末尾,循环结束。
你看,整个过程中'Mary'只是被next()方法跳过了,根本没被输出,也没有被删除——这就是为什么后续for循环里还能正常看到'Mary'的原因。
修正后的正确代码
解决这个问题的核心是只调用一次next(),把当前元素存到变量中复用,避免指针意外移动:
public static void main(String[] args) { ArrayList<String> names = new ArrayList<String>(); names.add("John"); names.add("Mary"); names.add("George"); names.add("Nick"); Iterator<String> iterator = names.iterator(); System.out.println("Iterator method: "); while (iterator.hasNext()){ String currentName = iterator.next(); // 仅调用一次next(),存储当前元素 System.out.println(currentName); if (currentName.equals("Nick")){ iterator.remove(); } } System.out.println("\nFOR loop method: "); for (int i=0; i < names.size(); i++){ System.out.println(names.get(i)); } }
修正后执行的输出会符合预期:
Iterator方式:
John
Mary
George
FOR循环方式:
John
Mary
George
内容的提问来源于stack exchange,提问作者Fotis Zachopoulos
相关产品推荐
相关产品推荐

