集合框架----源码解读LikedHashSet篇

news/2024/4/25 10:17:20/文章来源:https://blog.csdn.net/qq_42847719/article/details/128089922

1.官方介绍

Hash表和链表实现了Set接口,具有可预测的迭代顺序。该实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。该链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。注意,如果一个元素重新插入到集合中,插入顺序不受影响。当s .包含( e )在调用之前立即返回true时调用(如果s . add ( e ) ,则元素e重新插入到集合s中)。
这种实现使其客户端免受HashSet提供的未指定的、通常是混乱的排序,而不会增加与TreeSet相关的成本。它可以用来产生一个集合的副本,该集合与原集合具有相同的顺序,而不管原集合的实现方式如何:

  void foo(Set s) {
           Set copy = new LinkedHashSet(s);
           ...
       }
 

这种技术特别有用,如果一个模块在输入上取一个集合,复制它,然后返回由复制的顺序决定的结果。(客户一般赞赏以相同的顺序返回的东西。)
该类提供了所有可选的Set操作,并且允许空元素。与Hash Set一样,它为基本操作(添加、包含和移除)提供了常数时间性能,假设哈希函数在桶之间适当分散元素。性能很可能只是略低于Hash Set,因为增加了维护链表的费用,但有一个例外:在Linked Hash Set上迭代需要与集合大小成比例的时间,而不管其容量如何。在HashSet上进行迭代可能比较昂贵,需要的时间与其容量成正比。

一个链接哈希集有两个影响其性能的参数:初始容量和负载因子。对于HashSet而言,它们是精确定义的。但需要注意的是,选择过高的初始容量值对该类的惩罚不如Hash Set严重,因为该类的迭代次数不受容量的影响。
注意,这种实现并不同步。如果多个线程同时访问一个链接哈希集,并且至少有一个线程修改该哈希集,则必须对其进行外部同步。这通常是通过对一些自然封装集合的对象进行同步来完成的。如果不存在这样的对象,则应该使用Collections . synchronoused Set方法对集合进行"包装"。这最好在创建时完成,以防止意外的不同步访问集合:

Set s = Collections.synchronizedSet(new LinkedHashSet(...));

该类迭代器方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时候修改了集合,除了通过迭代器自己的移除方法之外,迭代器将抛出Concurrent ModificationException异常。因此,在面对并发修改时,迭代器能够快速、干净地失效,而不是冒着在未来不确定时刻发生任意、非确定性行为的风险。
需要注意的是,迭代器的快速失效行为是无法保证的,因为通常情况下,在存在不同步的并发修改的情况下,无法做出任何硬性保证。快速迭代器在尽力而为的基础上抛出Concurrent ModificationException。因此,编写一个依赖于该异常的程序来保证其正确性是错误的:迭代器的失效快行为应该只用于检测bug。

 2.LikedHashSet的特性

LikedHashSet是对HashSet的升级,主要是解决HashSet存放元素无序的问题,LikedHashSet底层就是LikedHashMap

3. 手写LikedHashSet

package com.example.list.list;import java.util.LinkedHashMap;//手写LinkedHashSet
public class LinkedHashSet<E> {private LinkedHashMap<E, Object> linkedHashMap;private static final Object PRESENT = new Object();public LinkedHashSet() {linkedHashMap = new LinkedHashMap();}public void add(E e){linkedHashMap.put(e, PRESENT);}@Overridepublic String toString() {return "LinkedHashSet{" +"linkedHashMap=" + linkedHashMap +'}';}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_38520.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA案例】作业管理系统(控制台版本)

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录一、JAVA面向对象程序设计1.1 工程分包1.2 各类属性及功能二、数据初始化三、学生模块四、教师…

传奇单机架设登录器配置教程

传奇单机顾名思义就是在本地电脑上架设传奇&#xff0c;限制同一个局域网才能一起玩&#xff0c;我接触到几个朋友不明白外网和单机的区别 架设单机需要准备以下程序&#xff1a; 传奇服务端&#xff08;版本Mirserver&#xff09; DBC2000 (百度可直接下载&#xff09; 配套登…

基于SpringBoot的会员制医疗预约服务管理信息系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

Apifox:成熟的测试工具要学会自己写接口文档

好家伙&#xff0c; 在开发过程中&#xff0c;我们总是避免不了进行接口的测试&#xff0c; 而相比手动敲测试代码&#xff0c;使用测试工具进行测试更为便捷&#xff0c;高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman&#xff0c;他还拥有一个非常nb的功…

【毕业设计】26-基于单片机心跳体温血压系统仿真设计(原理图+仿真+演示视频+论文)

【毕业设计】基于单片机心跳体温血压系统仿真设计&#xff08;原理图仿真演示视频论文&#xff09; 文章目录【毕业设计】基于单片机心跳体温血压系统仿真设计&#xff08;原理图仿真演示视频论文&#xff09;任务书设计说明书摘要设计说明书及设计文件任务书 以单片机为控制核…

【虚幻引擎UE】UE5 材质动态修改的2种方法(含工程源码)

演示效果&#xff1a; 示例工程源码 一、直接材质参数变量 1、贴图变量&#xff1a; 在材质蓝图中右键&#xff0c;创建变量TextureSampeParameter2D&#xff08;贴图变量&#xff09;。 输入RGB到基础颜色 2、单色变量&#xff1a; 在材质蓝图中右键&#xff0c;创建变量…

牛顿法,高斯牛顿法,列文伯格-马夸尔特(LM)法

文章目录一&#xff1a;牛顿法 &#xff08;Newtons method&#xff09;1&#xff1a;概述2&#xff1a;牛顿方向与牛顿法3&#xff1a;牛顿法的基本步骤4&#xff1a;举例二&#xff1a;高斯牛顿法 &#xff08;Gauss–Newton algorithm&#xff09;1&#xff1a;概述2&#x…

Metabase学习教程:仪表盘-5

SQL查询仪表盘添加筛选器 如何将过滤器小部件添加到仪表盘&#xff0c;并将它们连接到多个SQL查询中的字段过滤器变量。 本文介绍如何创建仪表盘小工具到过滤器数据输入SQL查询。图1显示了我们将要构建的仪表盘&#xff1a; 图1。我们将要构建的&#xff1a;一个仪表盘&#…

在el-table表头上引入组件不能实时传参bug

文章目录场景还原解决方法出现原因场景还原 产品要求&#xff1a;点击表格的表头&#xff0c;能触发一个下拉的列表&#xff0c;列表能携带表格的筛选条件&#xff0c;获取相应的数据 写了一个demo&#xff0c;来还原一下bug出现的场景&#xff1a; <div id"demo&qu…

分省/市政府性债务数据财政收支数据财政透明度

&#xff08;1&#xff09;30省地方政府债务面板数据 1、数据来源&#xff1a;自身 2、时间跨度&#xff1a;2012-2018年 3、区域范围&#xff1a;全国30各省&#xff08;西藏除外&#xff09; 4、指标说明&#xff1a; 部分指标如下&#xff1a; 负债率&#xff08;地方…

【性能|优化】TB级flink任务报错分析:Could not compute the container Resource

文章目录一. 问题引入1. 场景描述2. 日志简析二. 初级问题分析与解决1. 问题分析1.1. yarn的调度器设置1.2. 程序设置2. 问题解决三. &#xff08;性能&#xff09;新的问题1. 问题描述2. 理想化的最优方案3. "PlanB"的解决方案四. 反思与迭代一. 问题引入 1. 场景描…

Focal Self-attention for Local-Global Interactions in Vision Transformers

目录 Abstract 1. Introduction 2. MEthod 2.1 Model architecture 2.2 Focal self-attention 2.2.1 Window-wise attention 2.2.2 Complexity analysis 2.3 Model configuration 3. Related work 4. Experiments 4.1 Image classification on ImageNet-1K 4.…

xss-labs/level7

我们如同一下构造那样 <script>alert(xss)</script> 产生以下回显 接着查看源代码 发现第一个输出点被转义了 没有利用价值了 第二个输出点则是可以发现script关键字直接给干没了 氧化钙!!! 似此 如何处之&#xff1f; 我们猜测后台服务器还是对一些特殊字符进…

hiveSql 相互关注问题

hiveSql 相互关注问题说明需求分析优化实现最后说明 普遍社交软件上会有关注功能&#xff0c;如何知道自己的关注是否也是关注了自己呢&#xff1f; 需求 求关注结果数据中&#xff0c;相互关注的用户对。 数据如下&#xff1a; follow表&#xff1b;from_user&#xff1a;关…

人才资源开发杂志人才资源开发杂志社人才资源开发编辑部2022年第21期目录

开卷有益《人才资源开发》投稿&#xff1a;cnqikantg126.com 年轻干部要走好成长成才之路 赖宁; 1 特别关注 迎难而上 勇担重任 推进河南人事考试高质量发展 常万琦; 6-7 工作要闻 第五届中国河南招才引智创新发展大会开幕 归欣 ;张笑闻; 8 河南省12家企业和2个…

Playwright 简明入门教程:录制自动化测试用例,结合 Docker 使用

本篇文章聊聊如何使用 Playwright 进行测试用例的录制生成&#xff0c;以及如何在Docker 容器运行测试用例&#xff0c;或许是网上最简单的入门教程。 写在前面 Playwright 是微软出品的 Web 自动化测试工具和框架&#xff0c;和 Google Puppeteer 有着千丝万缕的关系。前一阵…

电脑密码忘了怎么解除?最简单操作的方法

可能很多人都遇到过这种情况&#xff1a;忘记了电脑密码。电脑密码忘了怎么解除&#xff1f;大多数人都不知道如何解决。下面就为大家分享一下电脑密码忘记怎么解决的方法&#xff0c;方法主要分为两种情况&#xff1a;一种情况是&#xff0c;电脑开机下忘记密码&#xff1b;另…

Cpp知识点系列-类型转换

前言 在做题的时候发现了需要用到类型转换&#xff0c;于是在这里进行了简单的记录。 历史原因&#xff0c;慢慢整理着发现类型转换也能写老大一篇文章了。又花了时间来梳理一下就成了本文了。 cpp 之前使用的环境是DEV-C 5.4&#xff0c;而对应的GCC版本太低了。支持c11需要…

智慧环卫管理系统解决方案(垃圾分类)

1.1 垃圾分类管理子系统 1.1.1 公众参与互动平台 可为客户量身打造微信公众号&#xff0c;搭建互动交流的平台&#xff0c;更好的调动居民参与垃圾分类的热情。 1.1.1.1 分类指导 将目前城市的垃圾处理情况、垃圾分类现状、分类的意义&#xff0c;以数据来说明垃圾分类的…

【设计】OOA、OOD、OOP

这三者都是 OO&#xff08;Object-Oriented&#xff09;领域的思想。 一般我们我们接到产品经理的需求后&#xff0c;开发阶段分这样几个步骤&#xff1a; 可行性预研阶段&#xff0c;此阶段评估需求是否合理&#xff0c;能否实现&#xff1b;OOA阶段&#xff0c;此阶段分析用…