【发布时间】:2016-06-28 23:44:00
【问题描述】:
我在List界面上阅读Java Tutorial Oracle,遇到如下语句:
对 next 和 previous 的调用可以混合使用,但你必须有点 小心。第一次调用 previous 返回与 最后一次调用下一个。
我很难理解这句话:第一次调用 previous 返回与最后一次调用 next 相同的元素。谁能详细解释一下?
【问题讨论】:
标签: java list collections next
我在List界面上阅读Java Tutorial Oracle,遇到如下语句:
对 next 和 previous 的调用可以混合使用,但你必须有点 小心。第一次调用 previous 返回与 最后一次调用下一个。
我很难理解这句话:第一次调用 previous 返回与最后一次调用 next 相同的元素。谁能详细解释一下?
【问题讨论】:
标签: java list collections next
希望这个例子能消除你的疑惑
List<Integer> colls = Arrays.asList(new Integer[]{1,2,3,4,5,6,7,8,9,10});
ListIterator<Integer> iterator = colls.listIterator();
iterator.next();
System.out.println("Last Call to next " + iterator.next());
System.out.println("First Call to previous " + iterator.previous());
【讨论】:
list.previous 返回列表中的前一个元素并将光标位置向后移动。注意交替调用 next 和 previous 将重复返回相同的元素。
ListIterator<Object> iterator = (ListIterator<Object>) myList.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
Object secondObject = iterator.previous();
o == secondObject; // ALways
}
【讨论】:
如果你改变你的心智模式,这很简单。 next 和 previous 的“光标”位于 元素之间。当您调用next 或previous 时,它会移动一个元素并返回它传递的元素。
它从第一个元素之前开始。对next 的调用返回它所经过的元素(第一个),并且光标停在第一个和第二个元素(元素0 和1)之间。
此时调用next 将返回第二个元素并将光标留在第二个和第三个元素之间。相反,如果您调用 previous,光标将返回第一个元素并返回它,再次停留在第一个元素之前。
【讨论】:
Iterator 的定义没有说明它如何在内部工作,它如何维护指向元素的“指针”。我的描述是一种抽象,它准确地捕获了界面的行为,而无需参考“幕后”发生的事情。重要的一点是Iterator 的行为就像光标在元素之间停止一样。如果你这样想,next 和previous 的行为是有道理的。这是关于接口和实现之间区别的有用教训。
对 previous 的第一次调用返回与对 next 的最后一次调用相同的元素。谁能详细解释一下?
如果你说.next() 然后.previous(),由于Iterator 的内部位置,你会得到相同的实例。否则,连续调用 .next() 将返回 same instance。
a b c
^
.next() 给出b,但将指针移动到c
a b c
^
所以.previous() 然后产生b。
【讨论】: