当前位置: 首页 > article >正文

【Java】泛型与集合篇 —— Set 接口

目录

  • Set 接口及实现类
    • HashSet 类
      • 特点
      • 内部实现
      • 构造方法
    • LinkedHashSet 类
      • 基本概念
      • 特点
      • 构造方法
      • 常用方法
      • 适用场景
    • 用 Set 对象实现集合运算
    • TreeSet 类
      • 特性
      • 构造方法
      • 常用方法
      • 注意事项
    • 对象顺序
      • 自然排序
      • 定制排序
      • 注意事项

Set 接口及实现类

HashSet 类

HashSet 是 Java 集合框架中 Set 接口的一个具体实现类,它存储唯一的元素,不允许重复值,且不保证元素的顺序。下面从多个方面详细介绍 HashSet 类。

特点

  1. 不允许重复元素:HashSet 会使用元素的 hashCode() 和 equals() 方法来确保元素的唯一性。当添加一个元素时,HashSet 首先会计算元素的哈希码,然后根据哈希码找到对应的存储位置,如果该位置已经有元素,会进一步使用 equals() 方法来判断两个元素是否相等,如果相等则不会添加该元素。
  2. 无序性:HashSet 不保证元素的存储顺序,即元素添加的顺序和遍历的顺序可能不同。
  3. 允许存储 null 元素:但只能存储一个 null 元素,因为重复的 null 元素会被视为相同元素而不被添加。
  4. 非线程安全:如果在多线程环境下使用,需要进行额外的同步处理,比如使用 Collections.synchronizedSet() 方法来包装 HashSet。

内部实现

HashSet 内部基于 HashMap 实现,它将元素存储在 HashMap 的键中,而值则统一使用一个静态的 PRESENT 对象。HashMap 的哈希表结构使得 HashSet 在插入、删除和查找元素时具有较好的性能,平均时间复杂度为 O (1)。

构造方法

  • HashSet() 创建一个空的散列集合,该集合的默认初始容量是 16,默认装填因子是 0.75。
  • HashSet(Collection c) 用指定的集合c的元素创建一个散列集合
  • HashSet(int initialCapacity) 创建一个散列集合,并指定集合的初始容量
  • HashSet(int initialCapacity,float loadFactor) 创建一个散列集合,并指定集合的初始容量和装填因子

以下是使用这些方法的代码示例:

import java.util.*;public class HashSetExample {public static void main(String[] args) {// 使用HashSet()构造方法HashSet<Integer> hashSet1 = new HashSet<>();hashSet1.add(1);hashSet1.add(2);System.out.println("使用HashSet()构造的集合: " + hashSet1);// 使用HashSet(Collection c)构造方法List<Integer> list = new ArrayList<>();list.add(3);list.add(4);HashSet<Integer> hashSet2 = new HashSet<>(list);System.out.println("使用HashSet(Collection c)构造的集合: " + hashSet2);// 使用HashSet(int initialCapacity)构造方法HashSet<Integer> hashSet3 = new HashSet<>(10);hashSet3.add(5);hashSet3.add(6);System.out.println("使用HashSet(int initialCapacity)构造的集合: " + hashSet3);// 使用HashSet(int initialCapacity, float loadFactor)构造方法HashSet<Integer> hashSet4 = new HashSet<>(10, 0.8f);hashSet4.add(7);hashSet4.add(8);System.out.println("使用HashSet(int initialCapacity, float loadFactor)构造的集合: " + hashSet4);}
}

注意事项:

  1. 当使用自定义类作为 HashSet 的元素时,必须重写 hashCode() 和 equals() 方法,以确保元素的唯一性判断正确。
  2. 在多线程环境下使用时,要进行同步处理,否则可能会出现数据不一致的问题。

LinkedHashSet 类

LinkedHashSet 是 Java 集合框架中的一个类,它结合了 HashSet 的哈希表存储特性和链表维护插入顺序的特性。下面从基本概念、特点、常用方法、示例代码等方面对 LinkedHashSet 类进行详细介绍。

基本概念

LinkedHashSet 继承自 HashSet 并实现了 Set 接口。它内部使用哈希表(HashMap)来存储元素,同时使用双向链表维护元素的插入顺序。这意味着当你遍历 LinkedHashSet 时,元素会按照它们被插入的顺序返回。

特点

  1. 元素唯一:和其他 Set 实现类一样,LinkedHashSet 不允许存储重复的元素。当你尝试添加重复元素时,LinkedHashSet 会忽略该操作。
  2. 保持插入顺序:LinkedHashSet 会维护元素的插入顺序,当你遍历集合时,元素会按照它们被插入的顺序依次返回。
  3. 非线程安全:LinkedHashSet 不是线程安全的。如果多个线程同时访问一个 LinkedHashSet,并且至少有一个线程修改了该集合,那么它必须在外部进行同步。可以使用 Collections.synchronizedSet 方法来包装 LinkedHashSet 以实现线程安全。
  4. 性能:LinkedHashSet 的基本操作(如 add、remove 和 contains)的时间复杂度是 ,和 HashSet 相同。但是由于需要维护链表,它的空间开销会略大一些。

构造方法

  • LinkedHashSet():创建一个空的 LinkedHashSet,初始容量为 16,加载因子为 0.75。
  • LinkedHashSet(int initialCapacity):创建一个具有指定初始容量的空 LinkedHashSet,加载因子为 0.75。
  • LinkedHashSet(int initialCapacity, float loadFactor):创建一个具有指定初始容量和加载因子的空 LinkedHashSet。
  • LinkedHashSet(Collection<? extends E> c):创建一个包含指定集合中所有元素的 LinkedHashSet。

常用方法

LinkedHashSet 继承了 HashSet 的大部分方法,因为它是 HashSet 的子类。以下是一些常用方法:

  • 添加元素
    • boolean add(E e):将指定的元素添加到集合中,如果集合中已经包含该元素,则返回 false。
    • boolean addAll(Collection<? extends E> c):将指定集合中的所有元素添加到该集合中。
  • 删除元素
    • void clear():移除集合中的所有元素。
    • boolean remove(Object o):如果集合中包含指定的元素,则将其移除。
  • 查找元素
    • boolean contains(Object o):如果集合包含指定的元素,则返回 true。
  • 集合大小
    • int size():返回集合中的元素数量。
  • 遍历元素
    • 可以使用迭代器(Iterator)、增强 for 循环或 forEach 方法来遍历 LinkedHashSet 中的元素。

以下是使用这些方法的代码示例:

import java.util.LinkedHashSet;public class LinkedHashSetExample {public static void main(String[] args) {// 创建一个 LinkedHashSet 并添加元素LinkedHashSet<String> fruits = new LinkedHashSet<>();fruits.add("Apple");fruits.add("Banana")

相关文章:

【Java】泛型与集合篇 —— Set 接口

目录 Set 接口及实现类HashSet 类特点内部实现构造方法LinkedHashSet 类基本概念特点构造方法常用方法适用场景用 Set 对象实现集合运算TreeSet 类特性构造方法常用方法注意事项对象顺序自然排序定制排序注意事项Set 接口及实现类 HashSet 类 HashSet 是 Java 集合框架中 Set…...

基于YOLOv8的人脸识别系统

文章目录 一.前言 二.原理阐述 三.源代码 四.代码改进 五.流程概述 一.前言 原开源项目是对于某时段校园门口学生出入的视频,使用YOLOv8目标检测算法以及yolov8l-face模型将目标换算成只检测人脸, 通过该模型中的track技术实现检测出的人脸进行自动跟踪, 通过跟踪到的…...

HBuilderX中,VUE生成随机数字,vue调用随机数函数

Vue 中可以使用JavaScript的Math.random() 函数生成随机数&#xff0c;它会返回 0 到 1 之间的浮点数&#xff0c; 如果需要0到1000之前的随机数&#xff0c;可以对生成的随机数乘以1000&#xff0c;再用js的向下取整函数Math.floor() 。 let randNum Math.random(); // 生成…...

论文笔记-WSDM2024-LLMRec

论文笔记-WSDM2024-LLMRec: Large Language Models with Graph Augmentation for Recommendation LLMRec: 基于图增强的大模型推荐摘要1.引言2.前言2.1使用图嵌入推荐2.2使用辅助信息推荐2.3使用数据增强推荐 3.方法3.1LLM作为隐式反馈增强器3.2基于LLM的辅助信息增强3.2.1用户…...

计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程

该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…...

Lookup Join显著增强,Paimon1.0版本如何做的?

Hi&#xff0c;大家好&#xff0c;我们又满血复活了。 2025年开年更新频率不快&#xff0c;一方面是大模型如火如荼&#xff0c;也一直在补相关知识&#xff1b;另外一方面&#xff0c;新的一年里身体健康被我摆到了第一位&#xff0c;不会像前几年那么卷了。 后续我们的更新会…...

【Golang学习之旅】如何在Go语言中使用Redis实现分布式锁,并解决锁过期导致的并发问题?

文章目录 前言1. 分布式锁的基本原理1.1 锁过期导致并发问题的解决&#xff1a; 2. Go实现分布式锁3. 代码实现分布式锁3.1 安装Go-Redis包3.2 创建分布式锁工具函数3.3 代码解析 4. 如何避免锁过期导致的并发问题4.1 延长锁的有效期4.2 利用Redis的WATCH命令&#xff08;乐观锁…...

Vue前端开发-Vant组件之Button组件

Vant 有丰富的UI组件&#xff0c;而基础组件是全部组件的核心&#xff0c;基础组件中将常用的元素做了二次的开发&#xff0c;封装成Vant格式组件&#xff0c;如按钮、图片和布局等&#xff0c;这些封装后的Vant组件&#xff0c;提供了更多面向实际应用的属性和事件&#xff0c…...

DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在当今数字化时代&#xff0c;AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型&#xff0c;凭借其出色的性能和开源免费的优势&#xff0c;成为许多开发者的首选。今天&#xff0c;就让我们一起探索如何将DeepSeek接入PyCharm&#xff0c;实现高效、智…...

【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…...

健康养生:从生活细节开启活力之旅

在忙碌的现代生活里&#xff0c;健康养生不再是一个抽象概念&#xff0c;而是关乎生活质量的关键。其实&#xff0c;只要掌握日常养生要点&#xff0c;就能轻松开启活力满满的健康生活。 饮食是健康的基石。每日饮食需遵循 “彩虹原则”&#xff0c;摄入多种颜色食物。早餐时&…...

DeepSeek + Mermaid编辑器——常规绘图

下面这张图出自&#xff1a;由清华大学出品的 《DeepSeek&#xff1a;从入门到精通》。 作为纯文本生成模型&#xff0c;DeepSeek虽不具备多媒体内容生成接口&#xff0c;但其开放式架构允许通过API接口与图像合成引擎、数据可视化工具等第三方系统进行协同工作&#xff0c;最终…...

DevOps自动化部署详解:从理念到实践

在软件开发日益快速迭代的今天&#xff0c;如何以高效、稳定且可重复的方式将代码变更从开发环境自动部署到生产环境成为企业竞争的重要因素。DevOps 正是在这一背景下应运而生&#xff0c;它打破开发、测试、运维之间的壁垒&#xff0c;通过自动化工具和流程&#xff0c;实现持…...

【拥抱AI】GPT Researcher的诞生

一、GPT Researcher 研究过程总结 GPT Researcher 是一个开源的自主智能体&#xff0c;旨在通过利用人工智能技术实现高效、全面且客观的在线研究。它通过一系列创新的设计和优化&#xff0c;解决了传统研究工具&#xff08;如 AutoGPT&#xff09;中存在的问题&#xff0c;如…...

Redis7——基础篇(三)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09; 接上期内容&#xff1a;上期完成了Redis的基本…...

ES12 weakRefs的用法和使用场景

ES12 (ECMAScript 2021) 特性总结&#xff1a;WeakRef 1. WeakRef 概述 描述 WeakRef 是 ES12 引入的一个新特性&#xff0c;用于创建对对象的弱引用。弱引用不会阻止垃圾回收器回收对象&#xff0c;即使该对象仍然被弱引用持有。WeakRef 通常与 FinalizationRegistry 结合使…...

【Elasticsearch】搜索时分片路由

Elasticsearch 的Search Shard Routing&#xff08;搜索分片路由&#xff09;是一个核心机制&#xff0c;用于在分布式环境中高效地分发和执行搜索请求&#xff0c;确保查询能够快速、准确地返回结果&#xff0c;同时充分利用集群资源并保持系统的高可用性。以下是结合上述内容…...

MySQL登录问题总结

不管何种数据库&#xff0c;使用的第一步都是先登录。 MySQL命令行登录语句&#xff1a;mysql -u username -P port -p -D database_name 登录MySQL的报错一般从报错信息都能得到反馈&#xff0c;常见报错原因分析如下&#xff0c;实例中的以test用户为例&#xff0c;登录环境为…...

一些耳朵起茧子的名词解释

1 web应用 1.1 web应用的概念 Web应用&#xff08;Web Application&#xff09; 是一种通过浏览器访问的软件程序&#xff0c;它运行在服务器上&#xff0c;用户通过网络&#xff08;如互联网或内网&#xff09;与它进行交互。与传统网站&#xff08;主要提供静态内容&#x…...

Redis 持久化:从零到掌握

Redis 作为一款广泛使用的内存数据库&#xff0c;虽然核心功能是基于内存提供高性能的数据存取&#xff0c;但在实际应用中&#xff0c;数据的持久化是不可忽视的。毕竟&#xff0c;内存中的数据一旦出现故障或重启&#xff0c;就会面临数据丢失的风险。因此&#xff0c;Redis …...

Mybatis MyBatis框架的缓存 一级缓存

1. 缓存的概念 缓存的概念 在内存中临时存储数据&#xff0c;速度快&#xff0c;可以减少数据库的访问次数。经常需要查询&#xff0c;不经常修改的数据&#xff0c;不是特别重要的数据都适合于存储到缓存中。 2.Mybatis缓存 mybatis包含了一个非常强大的查询缓存特性&#…...

第1章大型互联网公司的基础架构——1.6 RPC服务

你可能在1.1节的引言中注意到业务服务层包括HTTP服务和RPC服务&#xff0c;两者的定位不一样。一般来说&#xff0c;一个业务场景的核心逻辑都是在RPC服务中实现的&#xff0c;强调的是服务于后台系统内部&#xff0c;所谓的“微服务”主要指的就是RPC服务&#xff1b;而HTTP服…...

多个用户如何共用一根网线传输数据

前置知识 一、电信号 网线&#xff08;如以太网线&#xff09;中传输的信号主要是 电信号&#xff0c;它携带着数字信息。这些信号用于在计算机和其他网络设备之间传输数据。下面是一些关于网线传输信号的详细信息&#xff1a; 1. 电信号传输 在以太网中&#xff0c;数据是…...

idea-gradle打包运行配置

最近接触了一个项目&#xff0c;使用gradle做为构建工具&#xff0c;这里记录一波&#xff0c;毕竟平时使用的都是maven idea 配置 这里有个坑&#xff0c;Gradle Wrapper&#xff0c;配置的地址gradle下载超时 这个配置修改成阿里的 第一张 第二张 第二张配置的jvm貌似没啥用…...

(新版本onenet)stm32+esp8266/01s mqtt连接onenet上报温湿度和远程控制(含小程序)

物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意&#xff1a;ESP-01sWIFI模块&#xff0c;去搜了一下这个小东西很有玩点&#xff0c;远程控制LED啥的&#xff0c;然后我就想…...

一键部署开源DeepSeek并集成到钉钉

一键部署开源DeepSeek并集成到钉钉 简介&#xff1a; DeepSeek发布了两款先进AI模型V3和R1&#xff0c;分别适用于对话AI、内容生成及推理任务。由于官方API流量限制&#xff0c;阿里云推出了私有化部署方案&#xff0c;无需编写代码即可完成部署&#xff0c;并通过计算巢AppF…...

【爬虫基础】第一部分 网络通讯 P1/3

前言 1.知识点碎片化&#xff1a;每个网站实现的技术相似但是有区别&#xff0c;要求我们根据不同的网站使用不同的应对手段。主要是常用的一些网站爬取技术。 2.学习难度&#xff1a;入门比web简单&#xff0c;但后期难度要比web难&#xff0c;在于爬虫工程师与网站开发及运维…...

ES10中Object.fromEntries(),trimStart() ,trimend()的使用方法和使用场景例子

ES10&#xff08;ECMAScript 2019&#xff09;新特性总结 ES10&#xff08;ECMAScript 2019&#xff09;引入了一些新的方法&#xff0c;增强了 JavaScript 的灵活性和易用性。以下是 Object.fromEntries()&#xff0c;trimStart() 和 trimEnd() 的使用方法、使用场景以及例子…...

车载音频配置(二)

目录 OEM 自定义的车载音频上下文 动态音频区配置 向前兼容性 Android 14 车载音频配置 在 Android 14 中,AAOS 引入了 OEM 插件服务,使你可以更主动地管理由车载音频服务监督的音频行为。 随着新的插件服务的引入,车载音频配置文件中添加了以下更改: • OEM 自定义的车…...

级联选择器多选动态加载

一.级联展示 注&#xff1a;因为级联选择器这里是动态加载&#xff0c;因此如果上来选中一级就需要加载出后面三级的全部数据&#xff0c;依然会很卡&#xff0c;因此&#xff0c;和产品协商把一二级多选框去掉了&#xff0c;这样也避免了你选择一级不能实现子级被全部选中的问…...