首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有办法选择“未指定的行为”而不是ConcurrentModificationException?

有没有办法选择“未指定的行为”而不是ConcurrentModificationException?
EN

Stack Overflow用户
提问于 2017-02-01 22:07:58
回答 1查看 93关注 0票数 1

我知道这样的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for ( Object o: collection){
    if (condition(i)){
        collection.remove(i);
    }
}

将抛出一个ConcurrentModificationException,我理解为什么:直接修改集合可能会影响Iterator跟踪其位置的能力,例如,让它引用不再是集合一部分的元素,或者使它跳过刚刚添加的元素。对于上面这样的代码,这是一个合理的考虑,然而,我想写一些类似于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (Object o: set){// set is an instance of java.util.LinkedHashSet
    if (condition(o)){
        set.remove(other(o));
    }
}

在集合的排序中,其他(O)被保证“远离”o。在我的具体实现中,它永远不会少于47步,如果条件( o )是真的话,在它到达其他(O)的位置之前,所讨论的循环将被保证短路。因此,迭代器访问的集合的整个部分与被修改的部分完全解耦。此外,LinkedHashSet (快速随机访问插入和删除,保证迭代顺序)的特殊优点似乎特别适合于这种精确的操作。

我想我的问题有两个:首先,在上述限制下,这样的行动是否仍然危险?我认为可能的唯一方法是提前提前预加载Iterator值并缓存,我认为这将提高许多应用程序的性能,但在其他许多应用程序中似乎也会减少,因此对于java.util中的通用类来说是一个奇怪的选择。但也许我错了。当涉及到诸如缓存之类的事情时,我对效率的直觉常常被怀疑。其次,假设这类事情至少在理论上是安全的,那么除了完全重新实现LinkedHashSet或牺牲效率之外,还有什么方法可以实现这一操作吗?我能不能让集合忽略这样一个事实,那就是我正在修改集合的另一个部分,然后照常进行它的工作。我目前的工作是先将元素添加到中间集合中,然后在循环完成后将它们添加到主集合中,但这是效率低下的,因为它必须将值添加两次。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 22:20:03

引发ConcurrentModificationException是因为您的集合可能无法在任何时候处理删除(或添加)。例如,如果您执行的删除意味着您的LinkedHashSet必须减少/增加底层HashMap在幕后占用的空间呢?它需要做大量的更改,这可能会使迭代器变得无用。

你有两个选择:

使用Iterator迭代并删除元素,例如调用Iterator iter = linkedHashSet.iterator()获取迭代器,然后通过iter.remove()删除元素

使用java.util.concurrent包下可用的并发集合之一,该集合旨在允许并发修改

This question包含关于使用Iterator的详细信息。

在评论后更新

您可以使用下面的模式来删除您想要的元素,而不会导致ConcurrentModificationException:在循环遍历LinkedHashSet元素时,收集您希望在List中删除的元素。然后,循环遍历列表中的每个toBeDeleted元素,并将其从LinkedHashSet中删除。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41995278

复制
相关文章
deploy to heroku
deploy to heroku install heroku https://devcenter.heroku.com/articles/getting-started-with-java#introduction create heroku webapp plugin <dependency> <groupId>org.glassfish.jersey.archetypes</groupId> <artifactId>jersey-heroku-webapp</artifactId>
用户3004328
2018/09/06
1.2K0
本地tomcat 配置环境变量[通俗易懂]
3、配置环境变量完成后,测试配置结果 将 tomcat 解压后的 bin 目录下的 startup.bat 文件,复制到其他文件夹并双击启动
全栈程序员站长
2022/09/05
4580
heroku快速部署node应用
试了一下heroku,简直碉堡了,下面介绍如何简单几步实现弄得应用的部署访问: 1、首先https://dashboard.heroku.com/进行账号注册 2、github上push一个最新的no
用户1141560
2017/12/26
1.3K0
heroku快速部署node应用
在 Heroku 上部署 Django 应用
Heroku是一个很棒的平台,它有很多的控件,并且搭建环境相对来说也比较容易。本指南中,我将一步一步指导你在Heroku平台上部署一个简单地Django应用。
星哥玩云
2022/07/03
1.6K0
python打印环境变量
查看环境变量 import sys print sys.print 打印 echo $PYTHONPATH export:将自定义变量设定为系统环境变量(当前shell中有效) export PATH=$PATH:/…/bin
py3study
2020/01/06
2.6K0
python环境变量配置
程序和可执行文件可以在许多目录,而这些路径很可能不在操作系统提供可执行文件的搜索路径中。
用户1168904
2021/08/02
21K0
python 获取环境变量
参考 https://docs.python.org/2/library/os.html
py3study
2020/01/06
8690
Python设置环境变量
点击链接下载:python下载 你也可以无脑安装,对计算机的影响不打,不过建议别无脑 我们选择自己安装,然后选择想要安装的目录,不然我们能看见在Install Now下面有一个目录那个就是默认的安装C盘位置,当然若你觉得这样好找python也可以直接点第一个安装
全栈程序员站长
2022/11/19
2.1K0
Python设置环境变量
【Linux】Linux环境变量的理解 --- 命令行参数、shell子进程、环境变量、本地变量…
1. 我们平常所用的Linux指令其实也是可执行程序,和我们自己写的二进制程序没什么两样,那么为什么在执行自己的程序的时候需要加上./,而执行这些系统提供的指令(可执行程序),不需要加上./呢?
举杯邀明月
2023/04/12
2.1K0
【Linux】Linux环境变量的理解 --- 命令行参数、shell子进程、环境变量、本地变量…
Salesforce Heroku(一)环境搭建
Heroku是一个支持多种编程语言的云平台即服务。在2010年被Salesforce.com收购。Heroku作为最开始的云平台之一,从2007年6月起开发,当时它仅支持Ruby,但后来增加了对Java、Node.js、Scala、Clojure、Python以及(未记录在正式文件上)PHP和Perl的支持。基础操作系统是Debian,在最新的堆栈则是基于Debian的Ubuntu。
repick
2021/12/20
2.5K0
Salesforce Heroku(一)环境搭建
python中添加环境变量
import sys sys.path 系统环境是一个list,可以将自己需要的库添加进入,例如mysql库,hive库等等。有三种方式添加,均验证通过: 1 临时添加,在一个shell窗口中 import sys sys.path sys.path.append(path)  但退出该shell窗口,即失效 2 使用pth文件永久添加  使用pth文件,在 site-packages 文件中创建 .pth文件,将模块的路径写进去,一行一个路径,以下是一个示例,pth文件也可以使用注释: # .pth fi
用户1214487
2018/01/23
2.5K0
python获取linux环境变量_linux如何设置环境变量
为了演示我的意思,采用两个大致相同的程序(C中的第一个,python中的另一个):
全栈程序员站长
2022/11/10
8.4K0
Salesforce Heroku(四)Salesforce中的应用(ConnectedApp)
前边我们开发好Heroku程序,在Salesforce中要如何使用呢,下边一种方法是做成一个ConnectedApp,然后在Lightning中做迁移跳转。
repick
2021/12/24
8640
Salesforce Heroku(四)Salesforce中的应用(ConnectedApp)
Salesforce的PaaS平台Heroku简介
Heroku是可支持多种编程语言的PAAS平台。现归属于Salesforce。Heroku与2007年开始发展起来,作为最早的云平台之一,在最初的时候只只能ruby编程语言,后来宣布支持Java、Node.js、Scala、Clojure、php以及Python这种语言。
臭豆腐
2019/04/16
7.3K0
Salesforce的PaaS平台Heroku简介
python设置进程的环境变量
import os print 'setenv...', print os.environ['USER'] # show current shell variable value os.environ['USER'] = 'Brian' # runs os.putenv behind the scenes os.system('python echoenv.py') os.environ['USER'] = 'Arthur' #
用户7705674
2021/11/01
8820
Salesforce Heroku(三)环境搭建-Eclipse
如果需要上传到GitHub上,需要在自己的GitHub账户上安装第三方服务验证,下边是安装流程
repick
2021/12/23
6380
Salesforce Heroku(三)环境搭建-Eclipse
从Heroku看好雨云帮
应用开发究竟有多难?对于体验过切肤之痛的企业、创业者、开发者来说,一定是一言难尽的。从寻找合适的技术人才到搭建基础设施,从选择正确的软件管理方法到长时间枯燥而复杂的测试、发布、部署、反馈……传统的应用开发行到此时,能否成功交付仍然是未知数。 而云计算的出现则为现代应用开发带来了新思路,身在海外的企业、创业者和开发者更早享受到了技术进步所带来的便利。 随着云计算的逐渐发展和成熟,越来越多的企业、开发者得以从如硬件、服务器管理等复杂而繁琐的工作中解放出来,将注精力集中在应用本身,利用更小的代价实现应用的快速交付
Rainbond开源
2018/05/31
1.4K0
如何设置python的环境变量_anaconda环境变量手动设置
在python项目实践中,不知道为什么我的os.getenv一直拿不到环境变量,于是我就试了三种设置环境变量的方法,中解决了问题。
全栈程序员站长
2022/09/25
4.6K0
如何设置python的环境变量_anaconda环境变量手动设置
搭建python本地源
[root@tongc-yum162 ~]# wget https://files.pythonhosted.org/packages/d3/3e/1d74cdcb393b68ab9ee18d78c11ae6df8447099f55fe86ee842f9c5b166c/setuptools-40.0.0.zip
py3study
2020/01/07
1.5K0
点击加载更多

相似问题

本地和Heroku环境变量

40

问题设置本地heroku环境变量

15

Heroku Python导入本地函数

20

导出用于本地开发和heroku部署的环境变量

11

更改heroku环境变量

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文