LinkedHashMap 的 ConcurrentModificationException

2024-04-20

不确定是什么触发了java.util.ConcurrentModificationException当我迭代时LinkedHashMap下面代码中的结构。使用Map.Entry方法效果很好。从之前的帖子中没有得到关于触发此问题的良好解释。

任何帮助,将不胜感激。

import java.util.LinkedHashMap;
import java.util.Map;

public class LRU {

    // private Map<String,Integer> m = new HashMap<String,Integer>();
    // private SortedMap<String,Integer> lru_cache = Collections.synchronizedSortedMap(new TreeMap<String, Integer>());

    private static final int MAX_SIZE = 3;

    private LinkedHashMap<String,Integer> lru_cache = new LinkedHashMap<String,Integer>(MAX_SIZE, 0.1F, true){
        @Override
        protected boolean removeEldestEntry(Map.Entry eldest) {
            return(lru_cache.size() > MAX_SIZE);
         }
    };    

    public Integer get1(String s){
        return lru_cache.get(s);        
    }

    public void displayMap(){
        /**
         * Exception in thread "main" java.util.ConcurrentModificationException
            at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:373)
            at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:384)
            at LRU.displayMap(LRU.java:23)
            at LRU.main(LRU.java:47)
         */
        *for(String key : lru_cache.keySet()){
            System.out.println(lru_cache.get(key));
        }*

// This parser works fine        
//        for(Map.Entry<String, Integer> kv : lru_cache.entrySet()){
//            System.out.println(kv.getKey() + ":" + kv.getValue());
//        }
    }

    public void set(String s, Integer val){
        if(lru_cache.containsKey(s)){            
            lru_cache.put(s, get1(s) + val);
        }
        else{
            lru_cache.put(s, val);
        }
    }

    public static void main(String[] args) {

        LRU lru = new LRU();
        lru.set("Di", 1);
        lru.set("Da", 1);
        lru.set("Daa", 1);
        lru.set("Di", 1);        
        lru.set("Di", 1);
        lru.set("Daa", 2);
        lru.set("Doo", 2);
        lru.set("Doo", 1);        
        lru.set("Sa", 2);
        lru.set("Na", 1);
        lru.set("Di", 1);
        lru.set("Daa", 1);

        lru.displayMap();

    }

}

阅读Javadoc 为LinkedHashMap http://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html:

结构修改是添加或删除一个或多个元素的任何操作 更多映射,或者在访问顺序链接哈希映射的情况下, 影响迭代顺序。在插入顺序链接哈希图中,仅 更改与已包含的键关联的值 该地图不是结构修改。在访问顺序链接中 哈希映射,只需使用以下命令查询映射get是一个结构性的 修改。

既然你路过true to the LinkedHashMap构造函数,它是按访问顺序排列的,当您尝试get从中得到一些东西,你正在结构上修改它。

另请注意,当您使用增强型for语法,您实际上正在使用迭代器。简化引用自JLS §14.14.2 http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2:

增强型for声明的形式为:

EnhancedForStatement:

for ( TargetType Identifier : Expression ) Statement

[...]

如果类型为表达是一个子类型Iterable<X>对于某些类型 争论X,然后让I是类型java.util.Iterator<X>;否则, 让I是原始类型java.util.Iterator.

增强型for语句相当于一个基本的for声明 表格:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
     TargetType Identifier =
         (TargetType) #i.next();
     Statement
}

#i是一个自动生成的标识符,与任何其他标识符(自动生成或以其他方式生成)不同 范围(第 6.3 节)位于增强的 for 语句发生的位置。

另外,在 Javadoc 中LinkedHashMap:

返回的迭代器iterator收集方法 此类的所有集合视图方法返回的是快速失败:如果在创建迭代器后的任何时间对映射进行结构修改,除了通过迭代器自己的方式之外的任何方式remove方法,迭代器将抛出一个ConcurrentModificationException.

因此,当您打电话时get在地图上,您正在对其执行结构修改,导致增强型 for 中的迭代器抛出异常。我认为你打算这样做,这样可以避免打电话get:

for (Integer i : lru_cache.values()) {
    System.out.println(i);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LinkedHashMap 的 ConcurrentModificationException 的相关文章

  • 如何创建一个在给定范围内随机打乱数字的 int 数组[重复]

    这个问题在这里已经有答案了 基本上 假设我有一个可以容纳 10 个数字的 int 数组 这意味着我可以在每个索引中存储 0 9 每个数字只能存储一次 如果我运行下面的代码 int num new int 10 for int i 0 i l
  • Android Canvas.DrawBitmap 没有模糊/抗锯齿?

    我正在尝试使用精灵 或非常像素化的角色 背景等 制作一个Android游戏 我把它们画在画布上 就像这样 matrix preScale xrat yrat canvas drawBitmap img matrix null 其中 img
  • 格式化 XmlGregorianCalendar 时区问题

    我需要将 java XmlGregorianCalendar 格式化为 yyMMdd 字符串 我的实现 XMLGregorianCalendar date getDate getting the date if date null Simp
  • 如何在 Intellij IDEA 中为 Apache Tomcat 指定自定义 JRE 路径?

    问题是如何指定自定义JRE路径为Apache tomcat in Intellij IDEA 当从以下位置启动应用程序时IDEA 看来 只需配置它的路径 路径jvm dll in Apache Tomcat监视器没有帮助 还有其他想法或方法
  • “赠送”应用内购买 Android

    有没有办法将 Google Billing 中的应用内购买 赠送 给特定帐户 我把这个问题放在这里是因为如果有一种方法可以以编程方式完成它 那很好 但不是必须的 在官方文档中找不到任何相关内容 我想要这个的原因是因为我的一个应用程序目前处于
  • 删除最低位

    给定一个二进制数 删除最低位的最快方法是什么 01001001010 gt 01001001000 它将在代码中用于迭代变量的位 伪代码如下 while bits 0 index getIndexOfLowestOrderBit bits
  • Xstream:删除类属性

    我该如何删除类 某事 Xstream 中的属性 我使用带注释的 Xstream 我读了它的代码 发现你的类不是mapper defaultImplementationOf fieldType 它会为你添加默认的类属性 除非类属性名称为nul
  • 如何在活动之间传递大型集合(主从流)

    背景 我正在实现一个从网络服务读取有关电影信息的应用程序 该网络服务返回有关每部电影的一些信息 标题 日期 海报网址 导演 演员等 该 Web 服务支持分页 因此电影以 100 部为一组加载 执行 这个想法是显示一个包含所有海报的网格 当用
  • 如何在 JasperReports 中解码 html 实体

    我有一些用 JasperReports 编写的报告 它们按字面意思显示 html 实体 例如 项目符号点 使用 html 实体文本表示显示 8226 你知道有什么办法吗 In the textField设置markup属性为html 这是如
  • Spring方法获取给定类型的所有bean

    我试图从一个相同类型的豆子中获取所有豆子FileSystemXmlApplicationContext 我正在使用factory getBeansOfType SomeType class 但我注意到它只返回顶级 bean 是否有任何其他方
  • Struts 2 - 使用 CKEditor 拦截上传的图像文件

    我有一个CKEditor在网站的不同页面上 所以我将上传内容设置为true以及让它工作的所有配置内容 并且图像上传工作得很好 Send it to the Server 标签 但从这里我想拦截或互动upload函数能够将图像上传到文件夹中
  • 如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

    有没有人尝试过在 spring boot 中禁用 mongodb 的自动配置 我正在尝试使用 spring data mongodb 来启动 spring boot 使用基于java的配置 使用 spring boot 1 2 1 RELE
  • 为什么这个 SimpleDateFormat 无法解析这个日期字符串?

    简单日期格式 SimpleDateFormat pdf new SimpleDateFormat MM dd yyyy hh mm ss SSSaa 抛出的异常pdf parse Mar 30 2010 5 27 40 140PM java
  • 如何在运行时更改 JList 的单元格图标

    如何更改仅一个 JList 单元格的 JLabel 图标 例如 在 JList 中单击 我尝试访问使用 listCellRender 获取的 JLabel 但它不起作用 Override public void valueChanged L
  • 为什么文件传输完成后我的列表视图条目的内容没有更新?

    为什么将文件复制到目录后listview没有更新驻留在该目录中的较新内容 仅当我退出时listview重新进入视图会刷新吗 有人可以告诉我如何解决这个问题吗 文件功能java文件的复制 您应该将新复制的文件 VideoInfo对象 添加到您
  • 如何在android中格式化长整型以始终显示两位数

    我有一个倒计时器 显示从 60 到 0 的秒数 1 分钟倒计时器 当它达到 1 位数字 例如 9 8 7 时 它显示 9 而不是 09 我尝试使用String format B 02d B x 我将 x 从 long 转换为字符串 它不起作
  • Java HashMap 与 ArrayList 相比的内存开销

    我想知道java HashMap与ArrayList相比的内存开销是多少 Update 我想提高搜索一大包 600 万以上 相同对象的特定值的速度 因此 我正在考虑使用一个或多个HashMap来代替ArrayList 但我想知道 HashM
  • 使用 HttpClient 在 java 中进行连接池 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 HttpClient 创建连接池 我必须频繁连接到同一台服务器 值得创建这样一个池吗 是否可以保持 HTTP 连接处于活动状
  • Spring:在属性文件中定义@RequestMapping值

    是否可以定义a的值 RequestMapping在 Spring 中通过在属性文件中定义注释 实际上 我做了类似的事情 Controller RequestMapping xxx public class MyController 但我想存
  • onActivityresult 数据为空

    这是我的相机应用程序 我想在其中捕获图像并裁剪它 但它拍照保存在我的 myimage 目录中 但不执行裁剪功能 请我需要帮助 我是这个领域的新人 这是我的相机开源代码 Intent intent new Intent MediaStore

随机推荐

  • 如何展平嵌套的Python字典?

    我正在尝试展平嵌套字典 dict1 Bob shepherd 4 6 3 collie 23 3 45 poodle 2 0 6 Sarah shepherd 1 2 3 collie 3 31 4 poodle 21 5 6 Ann sh
  • 尽管确实存在,但“不存在具有给定标识符的行”

    我正在使用 Hibernate 并得到 线程 main 中的异常 org hibernate ObjectNotFoundException 不存在具有给定标识符的行 271 这个错误的奇怪之处在于 具有给定 id 的对象存在于数据库中 我
  • 子进程超时失败

    我想在子进程上使用超时 from subprocess32 import check output output check output sleep 30 shell True timeout 1 不幸的是 虽然这会引发超时错误 但它会在
  • 时间数组在建模中超出范围?

    这些天我正在尝试使用新的气象数据 以 netcdf 格式而不是旧的 cray 格式给出 运行我的气候模型 模型编译顺利 但是当进行模拟时 模型在第一天运行良好 但在模拟的第二天就停止了 总是在同一时间步长 无论我使用哪个开始日期 错误是 f
  • MySQL 的锁定和并发

    我目前正在将 Mysql 与 InnoDB 存储引擎用于所有表 所以 我想知道这是否是一个真正的问题以及是否有解决方案 例如 我将使用数据库事务向用户收费 1 检查他的余额 2 减去他的余额 3 将此余额记入某处 4 提交 如果更新发生在
  • 在 Chrome 扩展中,有没有一种方法可以以编程方式“单击”pageAction 按钮

    我有一个带有 pageAction 按钮的 Chrome 扩展程序 用户单击它 就会显示 popup html 窗口 以便用户可以执行需要的操作 有没有一种方法可以装饰页面上的链接 以便当用户单击该链接时 它会以编程方式向 pageActi
  • $this->form_validation->run() 在没有验证规则的情况下返回 FALSE

    使用 CodeIgniter 时Form validation类 该set rules 方法允许用户向其表单字段添加无限数量的检查 这些规则通常都定义在同一个地方 就在run 方法被调用 有效示例 Require the user to b
  • 为什么 jQuery 文件上传插件的进程事件不触发?

    我对 jQuery 文件上传插件有一个奇怪的问题 如果我使用这个 SITAX fileupload fileupload url myurl add function e data console log add event process
  • 如何将pandas数据框的单行拆分为两行?

    我试图将数据框的单行分成两行 在数据框中 开始和结束列可用 我想根据条件拆分行 我有一个如下所示的数据框 symbol start end size ABC 2015 08 27 18 00 00 2015 08 28 05 00 00 1
  • Haskell:为什么将辅助函数命名为“go”?

    I see go在阅读 Haskell 材料或源代码时 我经常会遇到这样的情况 但我从来没有真正感到舒服 我猜它在我的脑海中具有 goto 的负面含义 我开始用 LYAH 学习 Haskell 这就是我开始使用 Haskell 的原因acc
  • WebView - 在每个请求上定义用户代理

    目前 我将请求消息的 User Agent 设置如下 var rm new HttpRequestMessage HttpMethod Post new Uri http example com rm Headers Add User Ag
  • Android:如何最大化 PreferenceFragment 宽度(或消除边距)?

    如果您查看 Android 设置屏幕截图或BC碎片 https github com commonsguy cw android tree master Prefs FragmentsBC截图中 PreferenceFragment 中有边
  • 如何在 C# 中编写条件锁?

    问题是我一直在使用锁语句 http msdn microsoft com en us library c5kehkcz aspx为了保护我的代码的关键部分 但现在 我意识到我可以允许在满足某些条件的情况下并发执行该关键代码 有没有办法调节锁
  • PHP 字符串不允许使用 < 和 > 字符

    我的代码中有一个字符串 如下例所示 很简单 但是当我尝试回显字符串时 它不喜欢 字符 所有得到回应的是 巴拉巴拉 所以 基本上我猜我需要转义这些字符才能让它们在 PHP 中工作 但我不确定具体如何操作 我将其用于模板系统 因此在 html
  • MVC 中带有 Ninject 的适当存储库生命周期范围

    在 MVC 3 应用程序中将 Entity Framework 4 与 Ninject 结合使用时 存储库和 EF 上下文的适当生命周期范围是什么 我一直在使用默认的 InTransientScope 但质疑是否应该使用 InRequest
  • 如何使 BigCommerce 小部件与 PageBuilder 兼容

    我正在按照这里的教程https developer bigcommerce com api docs storefront widgets widgets tutorial https developer bigcommerce com a
  • 使用 Blazor 和 C# 刷新 html 表数据

    我有一种情况 我有一个 for 循环 它从我的数据模型创建我的 html 表 该数据模型从 SQL Server Express 获取数据 我想知道是否可以创建一个自动刷新方法 其中表数据仅刷新而不刷新整个页面 如果没有 那么也许 OnCl
  • 使用 PrototypeJS 进行跨源资源共享

    我在跨源资源共享和原型方面遇到一些问题 我对外部资源有一个简单的发布请求 对于简单的发布请求 必须满足一些规则 Content Type 必须是 application x www form urlencoded multipart for
  • 如何在 XMPP 中实现“上次查看时间”功能(如 Whatsapp)?

    我正在开发一个聊天应用程序 并希望添加 上次查看时间 功能 我正在尝试使用存在节来实现它 但遇到一个问题 请检查下面的链接 当用户 B 也不可用时 未获取用户 A 的不可用状态 https stackoverflow com questio
  • LinkedHashMap 的 ConcurrentModificationException

    不确定是什么触发了java util ConcurrentModificationException当我迭代时LinkedHashMap下面代码中的结构 使用Map Entry方法效果很好 从之前的帖子中没有得到关于触发此问题的良好解释 任