导航:首页 > 编程语言 > javafor循环删除元素

javafor循环删除元素

发布时间:2023-09-10 08:38:16

‘壹’ java中LISt遍历时如何remove元素

public
class
RemoveElementDemo
{
public
static
void
main(String[]
args)
{
List<String>
list
=
new
ArrayList<消裂>();
list.add("100012011");
list.add("10001201s1");
list.add("10001201s1");
//中毕解决方案:
//1.i--操作
/*for(int
i
=
0;i
<
list.size();i++){
String
b
=
list.get(i);
if(b.equals("502323232")){
list.remove(i);
i--;
}
}*/
//2.反向遍历
/*for(int
i
=
list.size()
-
1;i
>=
0;i--){
String
b
=
list.get(i);
if(b.equals("502323232")){
list.remove(i);
}
}*/
//解决方案:调用Iterator的remove()方法安全删除元素,避免异常
Iterator<String>
iter
=
list.iterator();
while(iter.hasNext()){
String
b
=
iter.next();
if(b.equals("100012011"卖桥芹)){
iter.remove();
}
}
for(String
b
:
list){
System.out.println(b);
}
}
}

‘贰’ Java中遍历ArrayList的过程中删除元素操作会发生并发修改异常

首先搞清楚不是x=n-1不报错。是因为他避开了错误,实际当你用倒数第2个来删除的时候,他就已经跳出循环,不会判断最后以为,这是为什么呢?

我们先看看加强for循环是怎么实现的。都知道是通过迭代实现,那么将for写成迭代器来看。

Iterator<Object>itr=al.iterator();
while(itr.hasNext()){
Objecto=itr.next();
System.out.println(itr.hasNext());
if("n".equals(o)){
al.remove(o);
}
}

以上就是加强for循环的真正样子。再来透析源代码。

al.iterator():返回一个迭代器没什么好说的;

itr.hasNext():通过判断cursor(游标) != size(长度)来决定是否结束循环,cursor(游标) 初始是0 每次经过itr.next() +1;当cursor==size时 会跳出循环,这也是为什么倒数第2个不会出错的主要原因;

itr.next(): 看源代码可以发现每次在next()调用后,都会先调用checkForComodification()这个方法;

checkForComodification(): 主要作用是判断itr迭代器数据是否和list一致,

有两个参数,

第一个modCount 集合结构变动次数,如:一开始你add调用了7次,那么这个数就是7,

第二个expectedModCount 在调用iterator()方法时,初始化值等于modCount ,

这个方法判断当modCount !=expectedModCount 时

抛出异常,如果你调用迭代器的remove方法,expectedModCount 会重新赋值,但是你调用的是list的remove方法,那么modCount 就会+1 而expectedModCount 不变,这就会造成modCount !=expectedModCount;

最后,看看为什么倒数第2个不会抛异常:

当他遍历到“n-1”时,cursor=6,然后调用remover(o)方法,size=6,这个时候调用了itr.hasNext()判断cursor是否等于size,前面说过,当cursor==size时,跳出循环,那么就不会进入next(),也就不会进入checkForComodification()方法,所以不会抛出异常,说白了,也就是循环次数少了一次。

结合着源码看,应该会比较清晰。

阅读全文

与javafor循环删除元素相关的资料

热点内容
c盘解压失败可以用空间吗 浏览:463
3d循环音乐哪个app好 浏览:769
压缩文件zip怎么解压不了 浏览:390
如何看苹果appstore软件是否收费 浏览:463
android发送字符串 浏览:13
python3最好的书籍推荐 浏览:684
蓝牙模块与单片机连接 浏览:665
mssql命令大全 浏览:193
mpv服务器怎么样 浏览:599
服务器迁移后怎么恢复 浏览:249
在vfp中如何显示和隐藏命令 浏览:283
如何部署地图服务器 浏览:737
安卓系统云闪付哪个app好用 浏览:111
程序员一天完成几个需求 浏览:960
请运行命令来卸载oracle 浏览:243
知识问答哪个app好 浏览:398
数控铣床编程代码大全 浏览:869
程序员相亲被骂 浏览:810
r6单片机 浏览:614
牛客编程题怎么评分 浏览:189