Java 集合-Set

news/2025/11/12 17:49:58/文章来源:https://www.cnblogs.com/Jing61/p/19214895

Java 集合 - Set 详解

集合(Set)是用于存储和处理无重复元素的高效数据结构,映射表(Map)则类似目录,支持通过键值快速查询和获取对应值。例如检验某人是否在论文答辩名单中,用 Set 实现比线性表更高效;若需存储学生详细信息(如性别、身高、住址),可将名字作为键值,通过 Map 快速获取,Map 是这类场景的理想数据结构。

Set 体系结构

Set 接口扩展自 java.util.Collection<E> 接口,未引入新方法或常量,仅规定实例不包含重复元素。实现 Set 接口的具体类需确保不添加重复元素,核心实现类有 HashSet、LinkedHashSet 和 TreeSet。
image

Set 核心实现类详解

HashSet

HashSet 用于存储互不相同的元素,追求高效存储与访问。添加到 HashSet 中的对象需正确实现 hashCode 方法,确保散列码分散,减少哈希冲突。

核心特性

  • 元素无序且唯一,基于哈希表实现。
  • 若两个对象相等(equals 方法返回 true),其散列码必须相同;不相等对象可能有相同散列码,因此应该重写 hashCode 方法以避免出现太多这样的情况。
  • Java API 中大多数类已实现 hashCode 方法,可直接使用。

构造方法

  1. HashSet():构造空散列集。
  2. HashSet(Collection<? extends E> elements):构造散列集并添加指定集合的所有元素。
  3. HashSet(int initialCapacity):构造指定容量(桶数)的空散列集。
  4. HashSet(int initialCapacity, float loadFactor):构造指定容量和装填因子的空散列集。装填因子是散列表填充百分比阈值(0.0~1.0),默认 0.75,是时间开销与空间开销的平衡值,超过阈值会触发再散列。

示例代码

HashSetDemo

package com.set;import java.util.HashSet;
import java.util.Set;/*** @author Jing61*/
public class HashSetDemo {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("hello world1");set.add("hello world2");set.add("hello world3");set.add("hello world2");System.out.println(set); // 插入无序System.out.println(set.size()); // 3Set<Circle> set1 = new HashSet<>();set1.add(new Circle(1));set1.add(new Circle(2));set1.add(new Circle(3));set1.add(new Circle(3));System.out.println(set1);}
}

Circle

package com.set;import java.util.Objects;/*** @author Jing61*/
public class Circle {private double radius;public Circle(double radius) {this.radius = radius;}public double getRadius() {return radius;}public void setRadius(double radius) {this.radius = radius;}public double findArea() {return Math.PI * radius * radius;}@Overridepublic String toString() {return "Circle[radius=" + radius + "]";}/*** 如果圆半径相等,圆对象相等* jdk规定:如果两个对象相等,那么它们的hashcode值一定相等* 两个不相等的对象可能存在相同的hashcode---hash碰撞(hash冲突)*/@Overridepublic boolean equals(Object o) {System.out.println("如果hash冲突,会调用该equals方法比较链表上是否存在相等对象");if (o == null || getClass() != o.getClass()) return false;Circle circle = (Circle) o;return Double.compare(radius, circle.radius) == 0;}@Overridepublic int hashCode() {System.out.println("保存前都会调用该对象的hashcode方法确定hash值");return Double.hashCode(radius);}
}

LinkedHashSet

LinkedHashSet 继承自 HashSet,通过链表扩展功能,支持元素排序。

核心特性

  • 继承 HashSet 的所有特性,保证元素唯一。
  • 维护元素插入顺序,可按插入顺序遍历元素,解决 HashSet 无序问题。
  • 性能略低于 HashSet,但遍历效率更高(链表保证顺序)。

构造方法

  1. LinkedHashSet():构造空 LinkedHashSet。
  2. LinkedHashSet(Collection<? extends E> elements):构造 LinkedHashSet 并添加指定集合的所有元素。
  3. LinkedHashSet(int initialCapacity):构造指定容量的空 LinkedHashSet。
  4. LinkedHashSet(int initialCapacity, float loadFactor):构造指定容量和装填因子的空 LinkedHashSet。

示例代码

package com.set;import java.util.LinkedHashSet;
import java.util.Set;/*** @author Jing61*/
public class LinkedHashSetTest {public static void main(String[] args) {Set<String> set = new LinkedHashSet<>();set.add("peppa");set.add("emily");set.add("pedro");set.add("jorge");set.add("peppa");System.out.println(set);for (var e : set)System.out.println(e.toUpperCase());}
}

TreeSet

TreeSet 基于红黑树实现,能确保集合元素有序排列。

核心特性

  • 元素唯一且有序,排序方式分为自然排序和定制排序。
  • 无哈希冲突问题,查询、插入、删除操作时间复杂度为 O(log n)。
  • 需元素支持排序(实现 Comparable 接口)或创建实例时指定外部比较器(Comparator)。

构造方法

  1. TreeSet():构造空 TreeSet,默认按自然排序(元素需实现 Comparable 接口)。
  2. TreeSet(Collection<? extends E> elements):构造 TreeSet 并添加指定集合元素,按自然排序。
  3. TreeSet(Comparator<? super E> comparator):构造空 TreeSet,按指定比较器排序。
  4. TreeSet(SortedSet<E> s):构造 TreeSet,包含指定 SortedSet 的元素,沿用其排序规则。

示例代码

package com.set;import java.util.Set;
import java.util.TreeSet;public class TreeSetTest {public static void main(String[] args) {// 字符串自然排序(按字典序)Set<String> set = new TreeSet<>();set.add("peppa");set.add("emily");set.add("pedro");set.add("jorge");set.add("peppa"); // 重复元素,添加失败System.out.println(set); // 输出:[emily, jorge, peppa, pedro](字典序排序)/** 定制排序:Circle 按半径降序排列* 1. 方式一:Circle 实现 Comparable 接口(自然排序)* 2. 方式二:创建实例时指定外部比较器(定制排序)*/Set<Circle> circles = new TreeSet<>((Circle c1, Circle c2) -> c1.getRadius() == c2.getRadius() ? 0 : (c1.getRadius() < c2.getRadius() ? 1 : -1));circles.add(new Circle(4));circles.add(new Circle(2));circles.add(new Circle(3));circles.add(new Circle(3)); // 重复元素,添加失败System.out.println(circles); // 输出:[Circle{radius=4}, Circle{radius=3}, Circle{radius=2}](降序)}
}

复用上述 Circle 类(已实现 equals 和 hashCode,支持 Comparable 自然排序)

class Circle implements Comparable<Circle> {private double radius;public Circle(double radius) {this.radius = radius;}public double getRadius() {return radius;}public void setRadius(double radius) {this.radius = radius;}public double findArea() {return Math.PI * radius * radius;}@Overridepublic String toString() {return "Circle[radius=" + radius + "]";}/*** 如果圆半径相等,圆对象相等* jdk规定:如果两个对象相等,那么它们的hashcode值一定相等* 两个不相等的对象可能存在相同的hashcode---hash碰撞(hash冲突)*/@Overridepublic boolean equals(Object o) {System.out.println("如果hash冲突,会调用该equals方法比较链表上是否存在相等对象");if (o == null || getClass() != o.getClass()) return false;Circle circle = (Circle) o;return Double.compare(radius, circle.radius) == 0;}@Overridepublic int hashCode() {System.out.println("保存前都会调用该对象的hashcode方法确定hash值");return Double.hashCode(radius);}// 自然排序:按半径升序@Overridepublic int compareTo(Circle o) {return Integer.compare(this.radius, o.radius);}
}

实现类选择建议

  1. 无需排序时,优先选 HashSet:效率最高,适合高频插入、删除和查找操作。
  2. 需保持插入顺序时,选 LinkedHashSet:兼顾唯一性和顺序性,遍历效率优。
  3. 需有序存储(自然排序/定制排序)时,选 TreeSet:无需额外排序操作,但元素需支持排序或指定比较器,性能略低于前两者。

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

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

相关文章

#题解#牛客:牛牛的构造#DP#构造#

传送门 分析 1.容易发现的一件事,当n,n-1,n-2......2,1排列时是满足条件的(i,j)对最多的n排列 2.我们用递推的想法求每一个n的最大(i,j)对数ans[n] ans[0] = 0;int pre = 0;int x = 0;for (int i = 1; i <= …

Machine Learning - SVM Part 2: The Radial Kernel

Machine Learning - SVM Part 2: The Radial Kernel

2025-11-12 ZYZ28-NOIP-aoao round 2 hetao1733837的record

2025-11-12 ZYZ28-NOIP-aoao round 2 hetao1733837的record比赛链接:比赛详情 - ZYZ28-NOIP-aoao round 2 - ZYZOJ 比赛背景 昨天双十一,ZYZ著名NOI Cu选手@[TaoRan](用户详情 - TaoRan - ZYZOJ)爆出了惊天大瓜——…

2025/11/12

2025/11/12滑动窗口的核心是通过维护一个动态调整的 “窗口”(连续子区间),用 O (n) 时间复杂度替代暴力枚举的 O (n),避免重复计算。 其核心逻辑是用左右指针界定窗口范围,根据问题条件移动指针收缩或扩展窗口,…

redis stream介绍

介绍 redis stream是一种类似日志追加的数据结构。可用来记录和实时处理事件。适用场景:事件溯源 传感器监控 通知性能 新增 O(1) 访问单个节点是O(n),n是ID的长度 redis stream使用radix trees实现 基础 XADD 新增条…

Java 线性表、栈、队列和优先队列

Java 线性表、栈、队列和优先队列 选择合适的数据结构和算法是开发高性能软件的关键。数据结构是按特定形式组织数据的集合,不仅存储数据,还支持数据的访问与处理操作。 在面向对象思想中,数据结构被视为容器或容器…

2025/11/11

2025/11/11全流程开发逻辑 从前端表单设计、后端 Servlet 处理、DAO 层数据库操作,到 MySQL 表结构设计,完整覆盖了 “用户交互 -> 业务逻辑 -> 数据存储” 的 Web 应用开发流程。 问题排查方法 面对代码报错,…

植物大战僵尸修改器下载教程:图文详解与实用技巧

前言: 在塔防游戏还没有被各类快节奏手游占据之前,《植物大战僵尸》几乎是每位玩家电脑中必装的一款经典作品。即便十多年过去,它依然凭借简单的机制与极高的策略深度拥有极强的生命力。 对于不少老玩家来说,玩到中…

微服务——注册中心

常见的注册中心:eureka、nacos、zookeeper 服务注册和发现是什么意思?Spring Cloud是如何实现服务注册发现? 服务注册:服务提供者需要把自己的信息注册到eureka,由eureka来保存这些信息,比如服务名称、IP、端口等…

【深度学习计算机视觉】13:实战Kaggle比赛:图像分类 (CIFAR-10) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

fabricjs 整合 vue3-sketch-ruler 实现标尺功能

版本信息 fabricjs版本为6.7.1 ------ vue3-sketch-ruler的版本为1.3.15 引入标尺的部分代码<!-- 画布区域 --><div id="workspace" style="width: 100%;height: 100%; position: relative; …

2025年真空耙式干燥机定做厂家权威推荐榜单:真空单锥螺带干燥机/沸腾床干燥机/闪蒸干燥机源头厂家精选

在精细化工与制药行业对热敏性物料干燥要求日益严格的背景下,一台高性能的真空耙式干燥机已成为保障产品质量、提升生产效率的关键装备。 据干燥设备行业数据显示,2024年中国真空干燥设备市场规模达到87亿元,年增长…

基础查找算法(三)二分查找

基础查找算法(三)二分查找一 定义 二分查找(Binary Search)是一种基于分治策略的高效查找算法,专用于有序数据集合。它通过不断将搜索范围减半来快速定位目标元素,具有对数时间复杂度,适合处理大规模静态数据。…

2025年软像套电缆订做厂家权威推荐榜单:补偿电缆/矿物质电缆/电力电缆源头厂家精选

在工业自动化与智能制造浪潮中,一根高品质的软像套电缆不仅是电力与信号的传输载体,更是保障设备稳定运行的关键。 据行业数据显示,全球工业电缆市场规模预计到2031年将达到千亿级别,年复合增长率稳定提升。软像套…

2025年济南统招专升本学校权威推荐榜单:专升本机构报名/全日制专升本/专升本考试培训学校精选

在山东省专升本录取率持续走低的背景下,选择一家优质的统招专升本培训机构已成为考生成功升本的关键因素。 根据山东省教育招生考试院公布的数据,2024年山东专升本报考人数已突破17万,而总招生计划仅为7.6万人左右,…

一些水题

https://www.luogu.com.cn/problem/CF374B点击查看代码 #include <bits/stdc++.h> using namespace std;/*CF374B - Inna and Nine思路:- 找到字符串中所有 maximal 的“相邻两位和为9”的连续段(段内任意相邻…

(3)Bug篇 - 详解

(3)Bug篇 - 详解2025-11-12 17:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

西林瓶灌装轧盖机:黔东南折旧年限与成本解析

在黔东南地区,随着生物医药、民族医药及大健康产业的快速发展,对西林瓶灌装设备的需求持续增长。无论是本地药企扩产,还是新兴诊断试剂企业建线,西林瓶灌装轧盖机作为核心装备之一,其采购决策不仅关乎生产效率,更…

list对象 集合 和 String 互转

list<对象> 集合 和 String 互转maven 项目 首先导入alibaba的jar包<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</v…

碎碎念(二四)

awa跃龙门 鲤鱼跃龙门,长久以来津津乐道的话题。 指鲤鱼回游逆流而上时成功跃过激流,化龙的故事。 之前我认为它指春节时热闹喜庆(毕竟春节都是锦鲤和金龙),或者进士中举时用来庆祝。 大家都在对跃龙门的鲤鱼表示…