LinkedHashMap和LinkedHashSet 转来记录

2023-11-11


LinkedHashMap和LinkedHashSet是JDK 1.4中引入的两个新的集合类。虽然已经过去5年了,但我敢打赌并不是很多人都用过(因为我就没有用过)。但这两个类在某些情况下还是非常有用的,过去没有用,现在没有用,都没有关系。但还是应该对这两个Collection框架的新成员有所了解,因为也许以后你会到,或者其实你现在就应该要用到。


LinkedHashMap/LinkedHashSet 顾名思义,就是在Hash的实现上添加了Linked的支持。对于HashMap/HashSet的每个节点上通过一个链表串联起来,这样就可以保证确定的顺序。对于希望有常量复杂度的高效存取性能要求,同时有要求排序的情况下,现在可以直接使用LinkedHashMap/Set了。

对于LinkedHashMap还有一点特别注意,LinkedHashMap支持两种排序:插入顺序、访问顺序。前者是指按照插入时的顺序排序,后者是指按照最旧使用到最近使用的顺序。即如果在一个LinkedHashMap中有5个节点,现在的顺序是e1 e2 e3 e4 e5. 如果是使用顺序的话,现在访问了一次e2 那么e2节点将移至链表的尾部。现在顺序变为:e1 e3 e4 e5 e2.

这会造成严重的性能问题吗?答案当然是否定的。因为在这儿的链表操作是常量级的。这也是LinkedHashMap/Set在这儿比TreeMap/Set性能更高的原因。

同样,LinkedHashMap/Set也不是thread-safe的。如果在多线程下访问,是需要进行外部同步,或者使用Java代码
Collections.synchronizedMap()的方法包装成一个thread-safe的Map/Set。
Collections.synchronizedMap()的方法包装成一个thread-safe的Map/Set。

特别需要注意的是,在使用“访问顺序”时,读取节点操作也是“结构变化”的操作。因为,这会改变元素遍历的顺序。所以,在使用LinkedHashMap的iterator()方法,遍历元素时,如果其它线程有读取操作,也要进行同步。否则,也会抛出同其它fail-fast一样的由于删除或增加操作而引起的CurrentModificationException的例外。

LinkedHashMapHashMap等

转:

前段时间做了个商务网站,我是用eclipse3.2+jdk6.0+tomcat5.5开发的,等到交付放到服务器的时候,却发现出现了一些始料未及的问题。有一些是对java类函数还没搞的很明白,还有一些是jdk版本的问题,找一两个例子说明下。

问题1:HashMap

这个类比较有用的就是将“键-值”一一对应起来,利用了put(K key V value) 函数。最开始我实现的目的是按载入的顺序放入HashMap,然后利用(HashMap).values().iterator()转换为Iterator对象按载入的顺序输出。但最终的效果发现输出的值是乱序的,查了下资料才知道HashMap是随机输出的,要想实现按输入的顺序来输出需要用到HashMap的子类LinkedHashMap。于是,声明时候直接替换成new LinkedHashMap(),发现成功了。

还有利用put(K key V value)函数时,如果键K是int类型的数字,将在jdk1.4及以下版本中会报错,好像编译的时候无法自动匹配int类型的,解决办法就是:将这个Int型数据转换成String类型,比如String.valueOf(int pId);在jdk5.0及以上版本里将不会出现这种问题。

问题2:String.indexOf() 和 String.contains()

这两个函数都可以用来判断一个字符串中是否包含一个字符或部分字符串。但前者是jdk1.4版本就出现了;后者属于jdk5.0的新特性,原先没注意到这个问题,后来只好更换函数了。

简要说明下这两个函数(参考jdk文档):int indexOf(String str):返回第一次出现的指定子字符串在此字符串中的索引,不包含将返回-1;boolean contains(CharSequence s):当且仅当此字符串包含 char 值的指定序列
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LinkedHashMap和LinkedHashSet 转来记录 的相关文章

  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • Spring @Cacheable 和 @Async 注解

    我需要缓存一些异步计算的结果 具体来说 为了克服这个问题 我尝试使用 Spring 4 3 缓存和异步计算功能 作为示例 我们采用以下代码 Service class AsyncService Async Cacheable users C
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也

随机推荐

  • 线上验证真的就是点点点吗?

    最近测试了一个项目 与其他4个后台有合作 今天项目上线了 一下配置错了 一下数据错了 真整的有点手忙脚乱 于是 整理了一个checklist 供后续备忘 希望能对大家有所启发 线上验证 有些项目比较单一 或许点点点就足够了 但是遇到与其他项
  • SHELL脚本 遍历文件夹下所有文件以及子文件夹

    SHELL脚本 遍历文件夹下所有文件以及子文件夹 dir 要设置为局部变量 如果设置为全局变量 在func递归时传入的参数 会改变 dir的值 将导致之后的文件目录错误 为更改后的dir值 当前目录情况 执行完shell后 附上代码 bin
  • 从源码到原理剖析activity核心知识点

    如何在onResume方法中获取到View的宽高 有两种方式 post和addOnGlobalLayoutListener override fun onResume super onResume Log e onresume tabBot
  • 新手使用~React+Antd^4.1.3+Hooks自定义筛选框

    官网此版本的筛选组件为 根据可爱的pm的要求 需要添加全选 确认筛选 重置按钮 此情景适用于后端所需要的的参数传递为多选 数组的形式 而非单个字符串 引入需要的组件及包 import Table Button Checkbox Space
  • AAL:ATM 适配层(AAL0、AAL2、AAL3/4、AAL5)--网络大典

    ATM 适配层 AAL 主要负责 ATM 层与高层之间的信元转发过程 从上层收到信息后 AAL 将数据分割成 ATM 信元 从 ATM 层收到信息后 AAL 必须重新组合数据形成一个上层能够辨识的格式 上述操作称之为分段与重组 SAR 它是
  • 【哈夫曼树】

    目录 前言 1 哈夫曼树结构 2 初始化 3 构造哈夫曼树 4 获取Huffman编码 整体代码 前言 哈夫曼树又称最优二叉树 可以对带权节点进行编码并且保证每个数据的编码都不会是其他数据的前缀 保证了编码的唯一性 因此 哈夫曼编码又称为前
  • xcode开发中 各种警告

    一 Missing file xxx 如果你在finder中删除了工程里面的文件 xcode上会出现一个警告 Missing file xxx 有个警告在那恨事不自在 上网着了下 发现了如下解决方法 1 打开terminal cd 到刚才你
  • Mysql存储json格式数据需要掌握的

    目录 一 前言 二 什么是 JSON 三 Mysql当中json函数 四 JSON值部分更新 4 1 使用 Partial Updates 的条件 4 2 如何在 binlog 中开启 Partial Updates 4 3 关于 Part
  • centos7 git安装

    开发十年 就只剩下这套Java开发体系了 gt gt gt 由于centos中的源仓库中git不是最新版本 需要进行源码安装 1 查看yum仓库git信息 root iZm5e3d4r5i5ml889vh6esZ zh yum info g
  • ESB产品UI升级总结

    一款好的产品需要不断地打磨才能变得更完整 更稳定 企业服务总线ESB产品作为数通畅联的核心产品 为了能够更好地迎合客户的需求 实现更好的视觉效果和体验感 需要不断地迭代升级 本次升级主要是针对整体页面进行优化以及对部分功能进行修复和调整 升
  • Qt应用开发——前言

    在IT 电子 通信 智能硬件等行业 都有PC端软件应用开发的人才需求 岗位名称有上位机软件 平台软件开发 客户端软件开发 测试软件开发或自动化测试软件开发等 根据公司行业差别和应用场景的不同 技术框架和岗位名称会有一定的区别 PC端软件应用
  • 一.快捷键基本操作(1)

    一 几种最常用的快捷键 1 1 Ctrl C 复制 2 Ctrl V 粘贴 3 Ctrl X 剪切 4 Ctrl A 全选 5 Ctrl Z 撤销上一步操作 6 Windows Windows键就是在键盘左下方类似于窗口的标志 D 最小化所
  • 智慧背囊小故事

    1 甲去买烟 烟29元 但他没火柴 跟店员说 顺便送一盒火柴吧 店员没给 乙去买烟 烟29元 他也没火柴 跟店员说 便宜一毛吧 最后 他用这一毛买一盒火柴 这是最简单的心理边际效应 第一种 店主认为自己在一个商品上赚钱了 另外一个没赚钱 赚
  • [运放滤波器]2_运放反馈原理

    运放滤波器 3 反相同相比例放大电路 Multisim电路仿真 运放滤波器 2 运放反馈原理 运放滤波器 1 理想运放 虚短虚断 简单介绍负反馈对放大电路的影响 几种运放的反馈电路 以及对应的判断方法 反馈原理 反馈 系统的输出送回输入回路
  • WIN32 代码测试(Control)

    include
  • 破案了,能ping通但是网络不通,是它们在搞鬼

    平时 我们想要知道 自己的机器到目的机器之间 网络通不通 一般会执行ping命令 一般对于状况良好的网络来说 你能看到它对应的loss丢包率为0 也就是所谓的能ping通 如果看到丢包率100 也就是ping不通 ping正常 ping不通
  • Javascript数组常用方法重写之map,reduce,some,every

    概要 我们在前端开发过程中 经常使用到各种数组的原生方法 为了更好的理解和使用这些原生方法 所以笔者试着重写了这些方法 并实现了相同的功能 本文主要对map reduce some every这四个原型方法进行重写 代码实现 由于新方法也要
  • 矩阵求导(转)

    在网上看到有人贴了如下求导公式 Y A X gt DY DX A Y X A gt DY DX A Y A X B gt DY DX A B Y A X B gt DY DX B A 于是把以前学过的矩阵求导部分整理一下 1 矩阵Y对标量x
  • 解决Visio封闭图案不能填充问题

    1 首先在文件选项高级里选中以开发人员模式运行 然后visio工具栏就出现了开发工具这一选项 然后选中封闭图形 找到开发工具里的操作这一选项 然后先对图形执行修剪 再连接 最后就可以填充颜色了 看看填充的结果
  • LinkedHashMap和LinkedHashSet 转来记录

    LinkedHashMap和LinkedHashSet是JDK 1 4中引入的两个新的集合类 虽然已经过去 年了 但我敢打赌并不是很多人都用过 因为我就没有用过 但这两个类在某些情况下还是非常有用的 过去没有用 现在没有用 都没有关系 但还