removeRemove 是什么意思?

remove  时间:2021-08-25  阅读:()

list.remove为什么报错

作为Java大家庭中的集合类框架,List应该是平时开发中最常用的,可能有这种需求,当集合中的某些元素符合一定条件时,想要删除这个元素。

如: public class ListTest { public static void main(String[] args) { List<Integer> intList = new ArrayList<Integer>(); Collections.addAll(intList, 1, 2, 3, 5, 6); // for循环优化写法,只获取一次长度 for(int i = 0, size = intList.size(); i < size; i++) { Integer value = intList.get(i); // 符合条件,删除元素 if(value == 3 || value == 5) { intList.remove(i); } } System.out.println(intList); } } 执行后,会抛出IndexOutOfBoundsException,因为集合中存在符合条件的元素,删除后,集合长度动态改变,由于长度只获取一次,发生越界,所以,去掉for循环优化,如: public class ListTest { public static void main(String[] args) { List<Integer> intList = new ArrayList<Integer>(); Collections.addAll(intList, 1, 2, 3, 5, 6); for(int i = 0; i < intList.size(); i++) { Integer value = intList.get(i); // 符合条件,删除元素 if(value == 3 || value == 5) { intList.remove(i); } } System.out.println(intList); } } 输出:[1, 2, 5, 6],漏掉了5这个元素,当i=2的时候,值为3,删除后,后面的元素往前补一位,这时i=3的时候,值为6,跳过了5,这样也不行,随后想到了用for循环增强,不显示的操作下标,直接操作对象,如: public class ListTest { public static void main(String[] args) { List<Integer> intList = new ArrayList<Integer>(); Collections.addAll(intList, 1, 2, 3, 5, 6); for(Integer value : intList) { // 符合条件,删除元素 if(value == 3 || value == 5) { intList.remove(value); } } System.out.println(intList); } } 执行后,会抛出ConcurrentModificationException,字面意思是并发修改异常。

异常跟踪信息如下: Exception inthread "main" java.util.ConcurrentModificationException atjava.util.AbstractList$Itr.checkForComodification(AbstractList.java:449) at java.util.AbstractList$Itr.next(AbstractList.java:420) at ListTest.main(ListTest.java:13) 可以大概看出是执行到AbstractList中内部类Itr的checkForComodification方法抛出的异常,至于为什么出现异常,这里可以大概解释一下。

集合遍历是使用Iterator, Iterator是工作在一个独立的线程中,并且拥有一个互斥锁。

Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast原则 Iterator 会马上抛出java.util.ConcurrentModificationException 异常。

所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。

而要解决这个问题,可以使用Iterator的remove方法,该方法会删除当前迭代对象的同时,维护索引的一致性。

如: public class ListTest { public static void main(String[] args) { List<Integer> intList = new ArrayList<Integer>(); Collections.addAll(intList, 1, 2, 3, 5, 6); Iterator<Integer> it = intList.iterator(); while(it.hasNext()) { Integer value = it.next(); if(value == 3 || value == 5) { it.remove(); } } System.out.println(intList); } } 输出正确结果:[1, 2, 6]。

不使用迭代器的解决方案就是,自己维护索引,删除一个元素后,索引-1,如: public class ListTest { public static void main(String[] args) { List<Integer> intList = new ArrayList<Integer>(); Collections.addAll(intList, 1, 2, 3, 5, 6); for(int i = 0; i < intList.size(); i++) { Integer value = intList.get(i); if(value == 3 || value == 5) { intList.remove(i); i--; } } System.out.println(intList); } } 输出正确结果:[1, 2, 6]。

还有种取巧的方式是从最后一个元素开始遍历,符合条件的删除,如: public class ListTest { public static void main(String[] args) { List<Integer> intList = new ArrayList<Integer>(); Collections.addAll(intList, 1, 2, 3, 5, 6); for(int i = intList.size() - 1; i >= 0; i--) { Integer value = intList.get(i); if(value == 3 || value == 5) { intList.remove(i); } } System.out.println(intList); } } 输出正确结果:[1, 2, 6]。

最后,Java集合类框架真是大大方便了开发,不用自己去维护数组,随时担心着越界等问题。

当然List的实现类对插入、删除的效率不太一样,这取决于其实现的数据结构,是选择删除,还是选择新建个集合,这里就不做讨论了。

150. SQL语言中,删除表中数据的命令是( )。( ). A.DELETE B.DROP C.CLEAR D.REMOVE

答案是A delete是删除数据表的记录,语法为delete from <表名> [where<条件>] drop是删除数据表的字段 ,语法为alter table <表名> drop <字段> clear是清除主窗口屏幕

Remove 是什么意思?

及物动词 1.移走; 排除; 移开; 拿开; 去掉 2.开除; 免除, 解除(职务等) 3.脱去(衣服等);摘下 4. 去除,排除(污渍、不愉快的事物等);使消失 不及物动词 1.迁移; 移居 名词 1.距离;差距;间距

  • removeRemove 是什么意思?相关文档

创梦网络-江苏宿迁BGP云服务器100G高防资源,全程ceph集群存储,安全可靠,数据有保证,防护真实,现在购买7折促销,续费同价!

官方网站:点击访问创梦网络宿迁BGP高防活动方案:机房CPU内存硬盘带宽IP防护流量原价活动价开通方式宿迁BGP4vCPU4G40G+50G20Mbps1个100G不限流量299元/月 209.3元/月点击自助购买成都电信优化线路8vCPU8G40G+50G20Mbps1个100G不限流量399元/月 279.3元/月点击自助购买成都电信优化线路8vCPU16G40G+50G2...

JustHost:俄罗斯/新西伯利亚vps,512MB内存/5GB空间/不限流量/200Mbps/KVM/自由更换IP,$1.57/月

justhost怎么样?justhost是一家俄罗斯主机商,2006年成立,提供各种主机服务,vps基于kvm,有HDD和SSD硬盘两种,特色是200Mbps不限流量(之前是100Mbps,现在升级为200Mbps)。下面是HDD硬盘的KVM VPS,性价比最高,此外还有SSD硬盘的KVM VPS,价格略高。支持Paypal付款。国内建议选择新西伯利亚或者莫斯科DataLine。支持Paypal付...

3元/首月香港便宜vps究竟是什么货。

便宜的香港vps多少钱?现在国外VPS主机的价格已经很便宜了,美国VPS主机最低一个月只要十几元,但同样免备案的香港VPS价格贵不贵呢?或者说便宜的香港VPS多少钱?香港vps主机价格要比美国机房的贵一些,但比国内的又便宜不少,所以目前情况是同等配置下,美国VPS比香港的便宜,香港VPS比国内(指大陆地区)的便宜。目前,最便宜香港vps低至3元/首月、18元/月起,今天云服务器网(www.yunt...

remove为你推荐
accesspoint如何将电脑成为手机wifi的access point360网络收藏夹360网络收藏夹如何添加到本地收藏查杀木马请问有什么方法查杀木马价格咨询心理咨询价格昂贵吗软件更新不可用为什么vivo手机更新不了软件?锤子手机发布会视频锤子手机怎么开机的相关视频青岛it社区青岛市有多少个社区?地址电话名字给我留下qq空间播放器代码qq空间免费播放器代码余额宝客户端我的余额宝是用电脑操作充值的,为什么用手机的余额宝客户端看不到?网站建设的内容企业网站建设一般包含了哪些内容?
域名服务器 qq空间域名 中国域名网 亚洲大于500m 新站长网 牛人与腾讯客服对话 cpanel空间 合租空间 me空间社区 泉州电信 tna官网 亚马逊香港官网 绍兴电信 流媒体加速 双线asp空间 photobucket 注册阿里云邮箱 114dns 碳云 第八届中美互联网论坛 更多