- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这样的代码
for ( Object o: collection){
if (condition(i)){
collection.remove(i);
}
}
将抛出 ConcurrentModificationException,我明白为什么:直接修改集合可能会干扰迭代器跟踪其位置的能力,例如,留下对不再是集合一部分的元素的引用。集合,或导致它跳过刚刚添加的集合。对于上面这样的代码,这是一个合理的担忧,但是,我想写一些类似的东西
for (Object o: set){// set is an instance of java.util.LinkedHashSet
if (condition(o)){
set.remove(other(o));
}
}
其中 other(o) 保证在集合的排序中距离 o “远”。在我的特定实现中,它与 o 的距离永远不会少于 47“步”。此外,如果条件(o)为真,则所讨论的循环将保证在到达其他(o)所在位置之前短路。因此,迭代器访问的集合的整个部分与被修改的部分完全解耦。此外,LinkedHashSet 的特殊优势(快速随机访问插入和删除、保证迭代顺序)似乎特别适合这种类型的操作。
我想我的问题是双重的:首先,考虑到上述限制,这样的操作仍然危险吗?我认为可能的唯一方法是提前预加载迭代器值并进行缓存,我认为这会提高许多应用程序的性能,但似乎也会减少许多其他应用程序的性能,因此是一个对于 java.util 中的通用类来说,这是一个奇怪的选择。但也许我的想法是错的。当谈到缓存之类的事情时,我对效率的直觉常常受到怀疑。其次,假设这种事情至少在理论上是安全的,那么除了完全重新实现 LinkedHashSet 或牺牲效率之外,有没有一种方法可以实现这种操作?我可以告诉 Collections 忽略我正在修改 Set 的不同部分这一事实,而照常进行其业务吗?我当前的解决方法是首先将元素添加到中间集合,然后在循环完成后将它们添加到主集合,但这是低效的,因为它必须添加值两次。
最佳答案
抛出 ConcurrentModificationException
是因为您的集合可能无法始终处理删除(或添加)。例如,如果您执行的删除意味着您的 LinkedHashSet
必须减少/增加底层 HashMap
所占用的空间,该怎么办?它必须进行大量更改,这可能会使迭代器变得无用。
您有两个选择:
使用Iterator
来迭代元素并删除它们,例如调用 Iterator iter = linkedHashSet.iterator()
获取迭代器,然后通过 iter.remove()
删除元素
使用java.util.concurrent
包下可用的并发集合之一,这些集合旨在允许并发修改
This question包含有关使用 Iterator
评论后更新:
您可以使用以下模式来删除您想要删除的元素,而不会导致 ConcurrentModificationException
:在循环访问 List
时收集您想要删除的元素。 LinkedHashSet
元素。然后,循环遍历列表中的每个 toBeDeleted 元素并将其从 LinkedHashSet
中删除。
关于java - 有没有办法选择 "unspecified behavior"而不是 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41995278/
是否有办法获得一个 Behavior t [a],其中时间 t 时 [a] 的值是 Behavior t [Behavior t a] 中包含的值> 在时间 t?即,具有以下类型的函数: Behavi
(问题最初是由对 Are there race conditions in this producer-consumer implementation? 的回答下的评论提示的,但这里严格从 C 语言的
摘自本文:http://www-public.int-evry.fr/~gibson/Teaching/CSC7322/ReadingMaterial/Wegner87.pdf 它定义类型: type
阅读Akka 2.6.10 API Docs ,akka.actor.typed.scaladsl.Behaviors.setup 和 akka.actor.typed.scaladsl.Behavi
我从 easymock 和 JUnit 测试用例中得到了一些无法解释的行为。我收到 IllegalStateException:缺少前面方法调用的行为定义:myCollaborator.getCurr
在 akka typed 中,我们有行为的概念。 如果我们想保留 Actor 的相同行为,我们会在处理完一条消息后返回 Behaviors.same。但是我们也可以返回这个。两者有何不同? 最佳答案
我正在 Kubernetes 中创建一个 HorizontalPodAutoscaler,我需要将缩减稳定窗口配置为小于默认值。使用的代码和错误如下: apiVersion: autoscalin
在 Python 中,为什么 [:] 切片操作的行为不一致? 它对于列表和字符串的行为有所不同。 对于列表,它给出一个副本列表对象,对于字符串,它给出相同的字符串对象。 我觉得这令人困惑,违反直觉。有
我需要将一些对象存储到数据库中。 首先 我将它们存储在内存中(存储在集合中) 当其中一个正确存储在数据库中时,我会将其删除 所以, public class AuditService { pr
下面的程序 (prog1) 抛出 OutOfMemoryError 错误。确实如此。但如果我在第 5 行(prog2)下方添加 sysout,它不会抛出错误。这种奇怪的行为有什么原因吗? 程序1: p
我有以下二叉搜索树(在 C++ 中),我对特定代码行有疑问: delete k; 如果我删除该行,我的代码可以正常工作,但我不明白为什么。据我了解:来自 k 的数据被插入到树中,然后变量 k 被删除。
我想知道如果我尝试对已删除或可能尚未分配的指针执行 delete 会发生什么?我读过两件事:第一,delete 运算符会做一些检查,我们不需要检查指针是否为空;然后,我读到它会导致未知的行为.. 我在
我无法解释 Scala 集合的这种行为。 让我们从一些定义开始。 import scala.collection.mutable.Set case class Item(name: String, c
我一直在尝试在 wpf 窗口上实现一种行为,因此我在当前的解决方案中添加了对 System.Winodws.Interactivity 的引用,然后编写了所需的行为。但为了应用这种行为,我必须在 Wi
我试图理解 rdpmc 指令。因此,我有以下 asm 代码: segment .text global _start _start: xor eax, eax mov ebx, 10
我正在关注这里的测试:https://github.com/plone/plone.app.referenceablebehavior/blob/master/plone/app/referencea
行为(方法体)可以是状态机或事件 - 事件很容易理解,因为它们等同于过程代码。 我不明白状态机如何用作操作的行为? 您能为此提供一个简单的示例吗? ---注意--- Operation 是一个仅规范元
我正在尝试在 Cocoa 应用程序中实现自定义终止行为。通常,当我的应用程序正常退出时,它会执行最终运行时数据库清理,然后退出。每当调用 [NSApp Terminate:aSender] 时,都会在
这里没什么太严肃的,只是好奇。 我想举个例子,想出了这段代码: const { Observable, Subject } = Rx const timeout$ = new Subject() co
我希望类中的方法在 IO 线程上运行一些代码,但只有当它们订阅的主题具有特定值时。然后调用者应该在 Android UI 线程上收到响应。 类似这样的事情: public class MyClass
我是一名优秀的程序员,十分优秀!