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.距离;差距;间距
我们一般的站长或者企业服务器配置WEB环境会用到免费版本的宝塔面板。但是如果我们需要较多的付费插件扩展,或者是有需要企业功能应用的,短期来说我们可能选择按件按月付费的比较好,但是如果我们长期使用的话,有些网友认为选择宝塔面板企业版或者专业版是比较划算的。这样在年中大促618的时候,我们也可以看到宝塔面板也有发布促销活动。企业版年付899元,专业版永久授权1888元起步。对于有需要的网友来说,还是值...
昔日数据怎么样?昔日数据是一个来自国内服务器销售商,成立于2020年底,主要销售国内海外云服务器,目前有国内湖北十堰云服务器和香港hkbn云服务器 采用KVM虚拟化技术构架,湖北十堰机房10M带宽月付19元起;香港HKBN,月付12元起; 此次夏日活动全部首月5折促销,有需要的可以关注一下。点击进入:昔日数据官方网站地址昔日数据优惠码:优惠码: XR2021 全场通用(活动持续半个月 2021/7...
CloudCone 商家在以前的篇幅中也有多次介绍到,这个商家也蛮有意思的。以前一直只有洛杉矶MC机房,而且在功能上和Linode、DO、Vultr一样可以随时删除采用按时计费模式。但是,他们没有学到人家的精华部分,要这样的小时计费,一定要机房多才有优势,否则压根没有多大用途。这不最近CloudCone商家有点小变化,有新人洛杉矶优化线路,具体是什么优化的等会我测试看看线路。内存CPU硬盘流量价格...
remove为你推荐
云和数据云和数据到底是培训机构还是公司网络设备图标显示联网的UPNP设备的图标是什么东西提升网站排名提高网站排名方法组或资源的状态不是执行请求操作的正确状态在输入netsh wlan start hostednetwork时,显示无法启动承载网络,组或资源的状态不是执行操作的正确状态查看加密空间如何才能查看加密码的qq空间解码器有什么用什么是播放器解码器解码器有什么用监控解码器是指什么?照片ps是什么意思PS照片是什么意思?上海网络维护公司上海嘉定网络公司 做监控的和综合布线的有那几家怎样下载文件百度云网盘只有提取码怎么下文件
域名系统 绍兴服务器租用 cve-2014-6271 10t等于多少g 56折 轻博客 xfce debian源 debian7 商家促销 网通代理服务器 500m空间 云全民 howfile 双11秒杀 优酷黄金会员账号共享 香港亚马逊 域名dns 便宜空间 什么是web服务器 更多