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

Java集合——9.使用Set

目录
  • Java的Set集合
    • Set集合的特性和常用方法
    • Set与Map的关系
    • 常用的Set实现类
      • 1. HashSet
      • 2. TreeSet
    • 总结


Java的Set集合

Set集合的特性和常用方法

Set最显著的特点就是元素不可重复,这一特性使其常被用于去重操作。常用方法如下:

  • boolean add(E e):向集合中添加元素,若元素已存在则返回false
  • boolean remove(Object e):从集合中删除元素,若元素不存在则返回false
  • boolean contains(Object e):判断集合中是否包含指定元素
  • int size():返回集合中元素的数量

Set与Map的关系

从本质上来说,Set可以看作是只存储key而不存储value的Map。因此,放入Set的元素需要像Map的key一样,正确实现equals()hashCode()方法,否则无法保证去重功能的正确性。

以最常用的HashSet为例,HashSet仅仅是对HashMap的一个简单封装,它的核心代码如下:

public class HashSet<E> implements Set<E> {// 持有一个HashMap:private HashMap<E, Object> map = new HashMap<>();// 放入HashMap的value:private static final Object PRESENT = new Object();public boolean add(E e) {return map.put(e, PRESENT) == null;}public boolean contains(Object o) {return map.containsKey(o);}public boolean remove(Object o) {return map.remove(o) == PRESENT;}
}

常用的Set实现类

1. HashSet

HashSet是最常用的Set实现类,它具有以下特点:

  • 基于哈希表实现
  • 元素无序(遍历顺序与添加顺序无关)
  • 查找、添加、删除操作效率高(时间复杂度为O(1))

2. TreeSet

TreeSet实现了SortedSet接口,它的特点是:

  • 元素是有序的(按照自然顺序或自定义顺序)
  • 基于红黑树实现
  • 查找、添加、删除操作时间复杂度为O(log n)

使用TreeSet时,元素需要满足以下条件之一:

  • 实现Comparable接口,重写compareTo()方法
  • 创建TreeSet时传入Comparator对象

下面是TreeSet的简单示例:

import java.util.*;public class TreeSetDemo {public static void main(String[] args) {Set<String> set = new TreeSet<>();set.add("orange");set.add("apple");set.add("banana");// 遍历输出时会按字母顺序排列for (String s : set) {System.out.println(s);  // 输出apple, banana, orange}}
}

总结

  • Set用于存储不重复的元素,常用方法包括add()remove()contains()size()
  • HashSet基于哈希表实现,元素无序但性能优异
  • TreeSet基于红黑树实现,元素有序但性能稍逊
  • 放入Set的元素必须正确实现equals()hashCode()方法
  • Set非常适合用于去重操作和需要判断元素是否存在的场景
http://www.sczhlp.com/news/11424/

相关文章:

  • vue基础
  • 目标使用过期的TLS1.0 版协议与目标主机支持RSA密钥交换 漏洞修复 系统:windows10 - L-+*
  • python虚拟环境和包管理工具Pipenv详解
  • PG系列:pg_probackup的时间点恢复失败案例分析
  • OOP:构造方法
  • 日程管理功能的后端开源组件精选方案
  • 软考系统分析师每日学习卡 | [日期:2025-08-13] | [今日主题:逻辑结构设计]
  • MySQL查询表结构、表大小
  • xUnit 单元测试:如何构造可共享的测试实例?
  • 苹果紧急修复针对Chrome用户的零日漏洞
  • 一文详解2025年医疗器械CRM怎么选?(附选型要素、实施指南、服务商推荐、案例解读) - SaaS软件
  • 双重计数
  • 用块状数组求解区间众数问题
  • Java抛出异常
  • Java IO流
  • python虚拟环境详解
  • 在AI技术快速落地的时代,挖掘真实需求成为关键——某知名Go SDK框架需求洞察
  • 一步一步学习使用LiveBindings(12) LiveBindings与具有动态呈现的TListView
  • Project 2024 专业版增强版下载安装和激活教程(附安装包)
  • Datawhale AI夏令营 -「多模态RAG图文问答挑战赛」实战上分
  • 软工8.13
  • java学习(8月13号)
  • DAY14 前复盘+ 匿名函数 内置函数 面向对象编程
  • Demystifying LLM-Based Software Engineering Agents 论文笔记
  • Nginx入门 - Charon
  • python开发之路【第三章】:python数字类型与字符串
  • 为什么RAG技术可以缓解大模型知识固话和幻觉问题
  • [CTSC2017] 吉夫特 题解
  • 8.多层感知机+代码实现 [跟着沐神-动手学深度学习]
  • 2025.8.13