【数据结构】Java 集合 Set 接口及其实现类的定义简介

接口继承接口,类实现接口。

Set 是一个接口,实现了 Collection 接口(都带有泛型)。它可以被继承或实现。在Java 集合章节的知识点中,学习其子类对象的实现以及关系。

类关系图

可以在IDEA中直接生成

Set 类关系图
集合 Set 类关系图

<interface> Set

集合 Set 均是非线程安全的。

public interface Set<E> extends Collection<E> {// Query Operations
}

A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. As implied by its name, this interface models the mathematical set abstraction.

顾名思义,此接口对数学集抽象进行建模。

一个不含重复元素的集合,即任意元素使用equals函数比较时都返回false。

interface Set intro
Set 接口简介

常用的 Set 实现类有:

  • TreeSet
  • HashSet
    • LinkedHashSet 是 HashSet 的子类
public class TreeSet<E> extends AbstractSet<E>implements NavigableSet<E>, Cloneable, java.io.Serializable {}
public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable {}
public class LinkedHashSet<E>extends HashSet<E>implements Set<E>, Cloneable, java.io.Serializable {}
Set 接口与各实现类的关系类图
Set 接口与各实现类的关系类图

实现类 TreeSet

非线程安全的

TreeSet Class intro
TreeSet 类简介

实现类 HashSet

HashSet Class intro
HashSet 类简介

实现类 LinkedHashSet

Hash table and linked list implementation of the Set interface, with predictable iteration order. This implementation differs from HashSet in that it maintains a doubly-linked list running through all of its entries. This linked list defines the iteration ordering, which is the order in which elements were inserted into the set (insertion-order). Note that insertion order is not affected if an element is re-inserted into the set. (An element e is reinserted into a set s if s. add(e) is invoked when s. contains(e) would return true immediately prior to the invocation.)

This implementation spares its clients from the unspecified, generally chaotic ordering provided by HashSet, without incurring the increased cost associated with TreeSet. It can be used to produce a copy of a set that has the same order as the original, regardless of the original set's implementation:
      void foo(Set s) {
          Set copy = new LinkedHashSet(s);
          ...
      }

A linked hash set has two parameters that affect its performance: initial capacity and load factor. They are defined precisely as for HashSet. Note, however, that the penalty for choosing an excessively high value for initial capacity is less severe for this class than for HashSet, as iteration times for this class are unaffected by capacity.

LinkedHashSet 虽然继承 HashSet ,但跟 HashSet 有差别:

  • 其内维护了一个双向链表(doubly-linked),有序插入。
  • 可以传入Set参数直接创建 LinkedHashSet 对象为原始 Set 的副本,构造方法如下:
    /*** Constructs a new linked hash set with the same elements as the* specified collection.  The linked hash set is created with an initial* capacity sufficient to hold the elements in the specified collection* and the default load factor (0.75).** @param c  the collection whose elements are to be placed into*           this set* @throws NullPointerException if the specified collection is null*/public LinkedHashSet(Collection<? extends E> c) {super(Math.max(2*c.size(), 11), .75f, true);addAll(c);}
  • LinkedHashSet 和 HashSet 都有两个影响性能的参数:初始容量capacity  load factor。但是 LinkedHashSet 因为自身的迭代时间不受容量的影响(内部定义了迭代器方法),所以初始容量选择过高值的损失比 HashSet 要轻。
    • 迭代器只能尽力抛出ConcurrentModificationException,但不能完全保证非线程安全的 LinkedHashSet 可以不在并发场景中出问题。
    /*** Constructs a new, empty linked hash set with the specified initial* capacity and load factor.** @param      initialCapacity the initial capacity of the linked hash set* @param      loadFactor      the load factor of the linked hash set* @throws     IllegalArgumentException  if the initial capacity is less*               than zero, or if the load factor is nonpositive*/public LinkedHashSet(int initialCapacity, float loadFactor) {super(initialCapacity, loadFactor, true);}/*** Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>* and <em>fail-fast</em> {@code Spliterator} over the elements in this set.** <p>The {@code Spliterator} reports {@link Spliterator#SIZED},* {@link Spliterator#DISTINCT}, and {@code ORDERED}.  Implementations* should document the reporting of additional characteristic values.** @implNote* The implementation creates a* <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator* from the set's {@code Iterator}.  The spliterator inherits the* <em>fail-fast</em> properties of the set's iterator.* The created {@code Spliterator} additionally reports* {@link Spliterator#SUBSIZED}.** @return a {@code Spliterator} over the elements in this set* @since 1.8*/@Overridepublic Spliterator<E> spliterator() {return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);}

Note that this implementation is not synchronized. If multiple threads access a linked hash set concurrently, and at least one of the threads modifies the set, it must be synchronized externally. This is typically accomplished by synchronizing on some object that naturally encapsulates the set. If no such object exists, the set should be "wrapped" using the Collections. synchronizedSet method. This is best done at creation time, to prevent accidental unsynchronized access to the set:
    Set s = Collections. synchronizedSet(new LinkedHashSet(...));

LinkedHashSet 是非同步的,即非线程安全的。如果多线程并发操作 LinkedHashSet 并至少有一个线程修改了此哈希集,则必须在外部同步该数据。

  • 通常在自然封装的集合的某个对象上进行同步
  • 如果不存在此类对象,则应该使用如下Collections 类的方法同步,最好在创建对象时就执行操作,以避免不同步访问Set的不同步造成异常
 Set s = Collections. synchronizedSet(new LinkedHashSet(set));
LinkedHashSet 类简介
LinkedHashSet 类简介

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【青牛科技】应用方案 | D75xx-150mA三端稳压器

概 述 D75XX系列是一套三端高电流低压稳压器。它们可以提供 150mA 的输出电流和允许输入电压高达30V。它们有几个固定的输出电压范围为3.0 V至5.0 V。CMOS 技术确保低电压降和低静态电流。 虽然这些设备主要设计为固定电压调节器&#xff0c;但它们可以与外部元件一起使用&…

(三)使用Vite创建Vue项目,了解Vue3生命周期

&#xff08;三&#xff09;使用Vite创建Vue项目 序章Vite官网安装方式一安装方式二 Vue3生命周期生命周期的详细解释 序章 其实这个没什么难点&#xff0c;步骤也非常简单&#xff0c;首先我们在本地的目录上创建一个x项目文件夹,然后在控制台上敲一些命令即可。 Vite官网 Vi…

批量清除Word Excel PPT文件打开密码

工作中经常要处理很多带密码的Excel文件&#xff0c;如果一个一个手动删除密码&#xff0c;那工作量就很大了。 网上找了很多方法&#xff0c;都没有找到一个好用的能批量删除密码的软件。 下载地址&#xff1a;https://pan.quark.cn/s/e3bffeec5458 于是就写了一个批量删除E…

【Effective C++】阅读笔记3

1. 成员变量声明为Private 建议将成员变量声明为Private&#xff0c;然后再public中提供调用该数据的接口 设置成Private的原因分析 类内成员变量被声明为Private&#xff0c;那么就可以外部代码直接访问或者修改内部数据通过公共接口获取内部数据&#xff0c;这样可以减少对外…

QCustomPlot添加自定义的图例,实现隐藏、删除功能(二)

文章目录 QCustomPlot初识和基本效果图实现步骤:详细代码示例:实现原理和解释:使用方法:其他参考要实现一个支持复选框来控制曲线显示和隐藏的自定义 QCPLegend 类,可以通过继承 QCPLegend 并重写绘制和事件处理方法来实现,同时发出信号通知曲线的状态变更。 QCustomPl…

基于Java公益志愿捐赠管理系统设计与实现(源码+LW+调试+开题报告)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【反射率】-- Lab 转换(excel)

系列文章目录 文章目录 系列文章目录前言一、CIE1.CIE 简介2.cie 1931标准色度匹配函数数据3.从CIE1931RGB到CIE1931 XYZ 二、Lab颜色空间的理解1.Lab色差公式怎么计算色差 三、D65光源Lab计算总结 前言 一、CIE 1.CIE 简介 CIE是由国际照明工程领域中光源制造、照明设计和光…

RRSIS: Referring Remote SensingImage Segmentation

Abstract 从遥感图像中定位目标在实际应用中有很大的用处。 参考图像分割的目的是分割出给定表达所指向的对象&#xff0c;这在自然图像中得到了广泛的研究。我们为这项任务创建了一个名为RefSegRS的新数据集&#xff0c;使我们能够评估不同的方法。我们提出了一种语言引导的跨…

【论文复现】自动化细胞核分割与特征分析

本文所涉及所有资源均在这里可获取。 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 论文复现 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 自动化细胞核分割与特征分析 引言效果展示HoverNet概述HoverNet原理分析整…

长亭那个检测能力超强的 WAF,出免费版啦

告诉你们一个震撼人心的消息&#xff0c;那个检测能力超强的 WAF——长亭雷池&#xff0c;他推出免费社区版啦&#xff0c;体验地址见文末。 八年前我刚从学校毕业&#xff0c;在腾讯做安全研究&#xff0c;看到宇森在 BlackHat 上演讲的议题 《永别了&#xff0c;SQL 注入》 …

U-net网络实现细胞分割

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

Word首行空格不显示空格符号问题

Word段落首行空格设置指南 问题描述 在Word中编辑文档时&#xff0c;有时会遇到段落首行敲击空格键却不显示空格的问题。这通常与Word的自动更正设置有关。 解决方法 要解决此问题&#xff0c;需要调整Word的自动更正设置。具体步骤如下&#xff1a; 打开Word的"自动更…

Remix部署智能合约时报错:Gas estimation failed

1、在Remix部署智能合约时报错如下&#xff1a; 2、这时候即使发送交易&#xff0c;也无法部署 3、后来看到有人建议说调整一下GAS LIMIT&#xff0c;调整到30000000也不行&#xff0c;甚至当调整到6000000以后连交易记录都没有了 4、最终解决办法&#xff1a;Remix 和 Ganache…

我要精通前端-块级元素和行内元素深入学习笔记

真的发现前端天天增删改查&#xff0c;真的是问一些比较细节的知识&#xff0c;我真的懂么 1、块级元素间的margin会重叠&#xff0c; <div class"head"></div> <div class"content"></div>.head {margin: 5px;border: 10px sol…

C语言 循环高级

时间&#xff1a;2024.11.6 一、学习内容 1、无限循环 无限循环&#xff1a;循环永远停不下来 注意点&#xff1a;无限循环因为永远停不下来&#xff0c;所以下面不能再写其他的代码了 2、break 跳转控制语句&#xff1a; 在循环的过程中&#xff0c;跳到其他语句上执行 #…

62-Java-面试专题(1)__基础

62-Java-面试专题(1)__基础-- 笔记 笔记内容来源与黑马程序员教学视频 文章目录 62-Java-面试专题(1)__基础-- 笔记Java-面试专题(1)笔记中涉及资源&#xff1a; 一、二分查找①&#xff1a;代码实现1. 流程2. 代码实现3. 测试 ②&#xff1a;解决整数溢出&#xff08;方法一&…

解决CORS (跨源资源共享) 错误

问题引入 前端代码 <template><div id"hello-vue" class"demo">{{ message }}</div><el-button type"primary" click"handleClick">我是一个按钮</el-button></template><script setup>//加…

微信小程序 uniapp网络记账设计个人理财系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 aa账簿 (自动编号、用户id、用户账号、备注、登记时间、消费类型、创建时间、消费金额)&#xff1b; 配置文件 (自动编…

【SQL Server】华中农业大学空间数据库实验报告 实验一 数据库

实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法&#xff0c;认识界面&#xff0c;了解其两个基本操作系统文件&#xff0c;并能熟练区分与应用交互式与T-SQL式两种方法在SQL Server中如何进行操作&#xff1b;学习有关数据库的基本操作&#xff0c;包括&#xff1a…

大腾智能3D一览通携手飞书,实现高效设计协同

设计生产作为制造业的核心环节&#xff0c;其效率与协同性直接关系到企业的市场竞争力和响应速度。 在设计部门内部&#xff0c;虽然可以直接发送3D格式的文件进行沟通和评审&#xff0c;但当涉及到跨部门甚至是跨企业的协作时&#xff0c;情况就变得复杂。通常需要大量的多角…