Java集合的问题
import java.util.ArrayList;
import java.util.Iterator;
public class MyCollectionDemo5 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext())
{
String s = iterator.next();
if ("b".equals(s))
{
//指向谁,就删除谁
iterator.remove();
}
}
System.out.println(list);
}
}
结果:[c, d, e]
已知:当调用next方法的时候,向下移动指针,并且返回指针指向的元素
remove方法删除的元素是指针指向的元素。
当第一次执行String s = iterator.next();的时候,调用了next,返回指针指向的元素(0索引的b),并且把指针指向了1索引的b
如图:
因为remove方法删除的元素是指针指向的元素,此时指向的是1索引的b,那删掉的不就是1索引的b吗 想知道0索引的b是什么时候删掉的
我知道我的理解有问题 我也调试过了 但是还是不理解 求解答 谢谢
指针一开始不指向0,调用了next才指向0
其实你都调试过了应该一眼就能看出问题,点开迭代器的源码看一眼,remove方法是根据上一个元素来进行删除的
为了方便你看 把源码给你贴出来
public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
if ("b".equals(s))
{
//指向谁,就删除谁
iterator.remove();
}
remove()方法是:从底层集合中移除此迭代器返回的最后一个元素(即最近一此调用next()方法时指向的元素,对应题目的代码则是元素值等于"b"的两个元素,所以两个值是"b"的元素都被移走)。 每次调用next()时,只能调用此方法一次。
根据链接:
Java迭代器Iterator的remove()方法 - Chen洋 - 博客园
Java Iterator(迭代器) | 菜鸟教程