You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用ArrayList的listIterator时,add后调用previous无输出问题

ArrayList的ListIterator先add再previous的问题分析与解决

先看你提供的测试代码:

package listIterator;

import java.util.ArrayList;
import java.util.ListIterator;

public class Test {

    public static void main(String[] args) {
    
    ArrayList<Integer> list = new ArrayList<>();
    list.add(10);
    list.add(20);
    list.add(30);
    
    // this code will not work
    ListIterator<Integer> it;

        System.out.println("using add");
        it = list.listIterator(list.size());
        while(it.hasPrevious()) {
            it.add(5);
            it.previous();
            
        }
        System.out.println(list);   
    
    }
}

问题原因

这段代码会陷入无限循环,完全达不到在每个元素前插入5的预期效果,核心是没搞懂ListIterator的add()和previous()行为逻辑:

  • 用list.listIterator(list.size())初始化迭代器时,游标停在列表末尾(最后一个元素的后方)。
  • 第一次循环调用it.add(5),会把5插入到游标当前位置(即列表末尾),之后游标自动移到新插入元素的后方。
  • 紧接着调用it.previous(),游标会退回到刚插入的5的位置,此时游标仍在原最后一个元素(30)的后方,下一次循环hasPrevious()依然为true,导致重复执行add操作,无限往列表里插入5。

正确实现

如果需求是在每个元素前面插入5,正确的操作顺序是先调用previous()定位到目标元素,再调用add()插入:

package listIterator;

import java.util.ArrayList;
import java.util.ListIterator;

public class Test {

    public static void main(String[] args) {
    
    ArrayList<Integer> list = new ArrayList<>();
    list.add(10);
    list.add(20);
    list.add(30);
    
    System.out.println("using add");
    ListIterator<Integer> it = list.listIterator(list.size());
    while(it.hasPrevious()) {
        it.previous(); // 先移动到当前元素的位置
        it.add(5);     // 在该元素前面插入5
    }
    System.out.println(list);   // 输出:[5, 10, 5, 20, 5, 30]
    
    }
}

逻辑说明

  • 每次循环先调用previous(),将游标从当前位置移到前一个元素的位置,同时返回该元素。
  • 调用add(5)时,会把5插入到游标当前位置的前方(也就是刚定位到的元素的前面),插入后游标自动移到新元素的后方,不会干扰下一次迭代的定位。

内容的提问来源于stack exchange,提问作者user3640657

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:55:02