ListIterator奇怪添加到ArrayList

The*_*ken -6 java linked-list listiterator

我有以下代码:

    ArrayList<String> words;
    words = new ArrayList<String>();
    words.add("is");
    words.add("us");
    ListIterator<String> it;
    it = words.listIterator();
    it.add("##");
    System.out.println(words);
    it.next();
    it.next();
    it.previous();
    it.set("##");
    System.out.println(words);
Run Code Online (Sandbox Code Playgroud)

我希望输出会是## us ##,但是当我运行程序时它会返回## is ##.我希望这与ListIterator添加项目ArrayList而不是ArrayList向其自己添加项目有关.

为什么程序以这种方式运行?

Jon*_*eet 8

你的问题不明确,但我怀疑你可能遗漏的主要问题是ListIterator.add在当前位置插入:

该元素紧接在next()返回的下一个元素之前插入(如果有),并且在previous()返回的下一个元素之后插入(如果有的话).

并且:

新元素在隐式游标之前插入:对next的后续调用不受影响

因此,在您it.add("##")对列表的初始调用包含后"##","is" "us".然后你接下来两次移动 - 第一个移动光标到之后"is"(返回).第二个将光标移动到刚刚"us"(返回)之后.然后调用再次previous()返回"us",最后调用set()替换"us""##":

用指定的元素(可选操作)替换next()或previous()返回的最后一个元素.

这看起来完全符合文档.不幸的是,目前尚不清楚这些步骤中哪一个令你感到困惑,因为你在一个问题中混淆了这么多.