`

LinkedHashmap的构建函数的第三个参数引发的问题

 
阅读更多
注意: 这里只有构造函数的第三个参数为true时才会引发问题.
参考: http://www.codeguru.com/forum/printthread.php?t=446498

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

/**
 * LinkHashMap的 LRU顺序. 即构造函数的第三个参数
 * User: wenzhihong
 */
public class LinkHashMapTest {
    public static void main(String[] args) {
        //第三个参数为 true , 意味着 按访问顺序构造最近最少访问的内部链表.
        //这样在内部的链表中, 最近最少访问的排在最前面, 最多访问的排在后面. 迭代整个值是按链表从后往前的方式
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(16, 0.75f, true);

        //初使化值
        for(int i=(int)'a', k=1; i<=(int)'z'; i++, k++){
            map.put(String.valueOf(k), String.valueOf((char)i));
        }

        //打印出迭代的顺序
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + "  " + entry.getValue());
        }

        //随机get值
        int r = (int) (Math.random() * 26);
        for(int i=0; i<r; i++){
            int key = (int) (Math.random() * 26);
            System.out.println("vist key: " + key);
            map.get(String.valueOf(String.valueOf(key)));
        }

        //打印出map的迭代顺序, 可以看到跟第一次出来的不同, 因为我们用的是按访问顺序来构建内部链表
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + "  " + entry.getValue());
        }

        //取key的set, 然后进行迭代.
        //注意: 如果使用了 按访问顺序构建最近最少访问列表, 也就是LinkHashMap的第三个参数设置为true.
        //则不能使用用得到的keyset的方式, 然后get去访问map.
        //因为用这种方式, 第一次get()会修改keyset的顺序, 所以在第二次进行迭代时, 结构顺序发生了变化, 所以会报ConcurrentModificationException
        for (String k : map.keySet()) {
            System.out.println(k + "  " + map.get(k));
        }

    }
}

分享到:
评论

相关推荐

    清华JAVA第三版课件

    在“清华JAVA第三版课件”中,初学者将深入学习以下Java编程的基础知识: 1. **语法基础**:包括变量、数据类型(如整型、浮点型、字符型、布尔型)、运算符、流程控制(如if语句、for循环、while循环)、数组等。 ...

    LRU算法--utils工具包

    在Java中实现LRU缓存,我们可以借助一些内置工具或第三方库,如Java 8的`ConcurrentHashMap`结合`LinkedHashMap`,或者Google的Guava库中的`Cache`类。这篇博客文章可能讨论了如何使用这些工具来构建一个LRU缓存系统...

    Java数据结构和算法(第二版)

    3. 动态规划:通过构建子问题的最优解来找到整个问题的最优解,常用于背包问题、最长公共子序列和最短路径问题等。 4. 贪心算法:通过局部最优解逐步逼近全局最优解,适合解决资源分配和调度问题。 5. 回溯法:...

    基于Java实现缓存Cache的深入分析

    - `super(maxsize * 4 / 3 + 1, 0.75f, true)`:构造函数参数,第一个参数是初始容量,这里是最大容量的1.33倍,第二个参数是负载因子(0.75),第三个参数表示按访问顺序排序。 3. `removeEldestEntry`方法: - ...

    Java面试题集锦

    3. HTTP客户端:使用HttpURLConnection或第三方库(如Apache HttpClient)进行HTTP请求。 八、设计模式 23种设计模式,如工厂模式、单例模式、建造者模式、适配器模式、装饰器模式、代理模式等,理解它们的适用场景...

    JAVA 面试题总览(书签完整版)

    - 缺点:依赖第三方库,可能影响性能。 #### 20. 访问修饰符的应用设计作用 - **public**:公开,对所有类可见。 - **private**:私有,仅当前类可见。 - **protected**:受保护,对同一包内的类及子类可见。 - **...

    JAVA12天全掌握

    第三天:面向对象编程基础 1. 了解类与对象的概念,理解封装、继承和多态三大特性。 2. 创建和实例化对象,掌握构造函数的使用。 3. 学习类的成员变量和方法,包括静态与非静态的区别。 4. 实践抽象类和接口,理解...

    Java面试宝典汇总-se web 框架-探花 (3)(1).docx

    5. 数据库三范式:第一范式(1NF)、第二范式(2NF)和第三范式(3NF),是数据库设计时遵循的规范,确保数据无冗余、无依赖。 6. 存储引擎:MyISAM和InnoDB是MySQL中的两种主要存储引擎,MyISAM适合读取密集型应用...

    javaSE代码实例

    第3章 表达式——描述行为的元素 22 3.1 不简单的算术运算符 22 3.1.1 “+”运算符 22 3.1.2 “-”运算符 24 3.1.3 “*”运算符 25 3.1.4 “/”运算符 25 3.1.5 “%”运算符 26 3.2 自增自减运算 27...

    Java基础笔记(包括底层原理)

    Commons-io和Hutool等第三方库提供了更多高级的文件和流操作功能。 第五章涉及多线程和Java并发包(JUC)。多线程使程序能同时执行多个任务,可以通过继承Thread、实现Runnable或使用ExecutorService来创建。...

    Java基础尚硅谷宋红康学习笔记

    5. **集合框架高级**:包括List、Set、Map接口的高级实现,如TreeSet、TreeMap、LinkedHashMap等,以及并发集合(如ConcurrentHashMap)和Stream API。 6. **网络编程**:涉及Socket编程、多路复用(如NIO、...

    2021-2022计算机二级等级考试试题及答案No.11905.docx

    第三代计算机使用集成电路;第四代计算机使用大规模集成电路。 - 晶体管作为电子器件标志着计算机技术的重大进步,因此晶体管计算机属于第二代计算机。 ### 25. Java 中的 DatagramSocket 类 - **知识点概述**:`...

    data-structure:仓库

    虽然Java标准库中没有直接的图数据结构,但可以通过自定义数据结构或使用第三方库实现。 7. **哈希表**:通过散列函数快速查找和存储元素,提供了常数时间的插入和查找操作。Java的HashMap和LinkedHashMap是常见的...

    java面试笔记整理,包含java,redis,kafka等

    3. **平台独立性:** Java程序可以编写一次并在任何平台上运行,这得益于Java虚拟机(JVM)的存在。 4. **安全性:** Java提供了多种安全特性来保护系统免受恶意攻击,例如沙箱模型。 5. **健壮性:** 强类型系统、异常...

    尚硅谷_Java面试题第一季(最新)

    尚硅谷推出的《Java面试题第一季》是一系列针对企业面试高频技术问题的视频教程。该课程覆盖了JavaSE、SSM(Spring、SpringMVC、MyBatis)、框架高级应用以及电商项目的相关知识点。通过这些视频,学习者可以深入...

    Java_BootCamp

    【Java_BootCamp】是一个专为初学者设计的Java编程训练营资料,旨在帮助学习者快速掌握Java编程语言的核心概念和技术。在这个训练营中,你可以深入理解Java的基础知识,包括语法、面向对象编程、异常处理、集合框架...

    第10单元

    在本单元的学习中,我们将深入探讨Java编程语言的相关知识点,这个单元主要涵盖了Java的基础概念、语法特性以及在实际开发中的应用。Java作为一种广泛使用的面向对象的编程语言,其强大之处在于它的跨平台能力、丰富...

Global site tag (gtag.js) - Google Analytics