javalist迭代删除_javaArrayList迭代过程中删除第⼀种迭代删除⽅式:
第⼆种迭代删除⽅式:
第三种迭代删除:
第四种迭代删除:
java下载过程第五种迭代删除:
噢苏珊娜第六种:
ArrayList中remove()⽅法的机制,⾸先看源码:
真正的删除操作在fastRemove(),⾸先定义⼀个新列表的长度newSize,其值为原列表长度减⼀ (newS-ze = size-1),然后将 索引 i 之后的数组元素全部向前进⼀位(System.arraycopy(es, i + 1, es, i, newSize - i)),接着最后⼀个原数组的最后⼀个元素置为null(es[size = newSize] = null;)。
所以使⽤for循环遍历删除的时候,每次循环时都要重新获取ArrayList的长度,并在删除元素之后将索引减1(i--)。
或者倒序删除。
迭代器删除:
private class Itr implements Iterator{int cursor; //index of next element to return//最后⼀个返回的元素的索引位置
int lastRet = -1; //index of last element returned; -1 if no such
int expectedModCount =modCount;//prevent creating a synthetic constructor
Itr() {}//当前迭代指⽰器是否指向列表末尾
public booleanhasNext() {return cursor !=size;建网站方法
}
@SuppressWarnings("unchecked")publicE next() {
移动web开发基础
checkForComodification();int i =cursor;if (i >=size)throw newNoSuchElementException();
Object[] elementData= ArrayList.this.elementData;if (i >=elementData.length)throw newConcurrentModificationException();
cursor= i + 1; //迭代指⽰器指向下⼀个元素
return (E) elementData[lastRet =i];
}/*** 删除*/
public voidremove() {if (lastRet < 0)throw newIllegalStateException();
checkForComodification();try{//调⽤fastRemove删除元素
ve(lastRet);//迭代指⽰器指向被删除元素所在的索引位置
cursor =lastRet;
lastRet= -1;
mysql数据库做完怎么保存
expectedModCount=modCount;
}catch(IndexOutOfBoundsException ex) {throw newConcurrentModificationException();
}
}
@Overridepublic void forEachRemaining(Consumer super E>action) {
action.accept(elementAt(es, i));//update once at end to reduce heap write traffic
cursor =i;
lastRet= i - 1;
checkForComodification();
}
}final voidcheckForComodification() {if (modCount !=expectedModCount)throw newConcurrentModificationException();
边框卡通
}
}
黄⾊部分是关键,删除元素后迭代指⽰器重新指向 “新” 元素,确保每⼀个元素都能被迭代指⽰器 “指” 过。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。