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

Java:HashSet的使用

目录

一、概念

二、常用操作

三、与其他Set比较


一、概念

HashSet 是 Java 集合框架 (java.util 包) 中的一个类,它实现了 Set 接口。

核心特点:

  • Set 接口的核心特性:一个不包含重复元素的集合。更正式地说,Set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多允许一个 null 元素。

  • 基于哈希表HashSet 的背后实现依赖于一个哈希表(具体来说是 HashMap 实例)。这是它所有特性的根源。

  • 无序性:它不保证元素的迭代顺序;特别是,它不保证顺序会随时间保持不变。

  • 非线程安全HashSet 不是线程安全的。如果多个线程同时访问一个 HashSet,并且至少有一个线程修改了它,则必须在外部进行同步。通常使用 Collections.synchronizedSet 来包装它:

Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<String>());

二、常用操作

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class HashSetDemo {public static void main(String[] args) {// 1. 创建HashSetSet<String> programmingLanguages = new HashSet<>();// 2. 添加元素programmingLanguages.add("Java");programmingLanguages.add("Python");programmingLanguages.add("C++");programmingLanguages.add("JavaScript");programmingLanguages.add("Java"); // 重复元素,不会被添加programmingLanguages.add(null); // 添加一个null值System.out.println(programmingLanguages); // 输出可能是:[null, Java, C++, JavaScript, Python] // 顺序是不确定的,并且可能与JVM版本有关。// 3. 检查元素是否存在boolean hasJava = programmingLanguages.contains("Java"); // trueboolean hasGo = programmingLanguages.contains("Go"); // false// 4. 移除元素programmingLanguages.remove("C++");System.out.println("After removing C++: " + programmingLanguages);// 5. 获取大小System.out.println("Size: " + programmingLanguages.size()); // 4// 6. 迭代HashSet (多种方式)// 方式一:使用增强for循环(推荐)System.out.println("=== Enhanced for loop ===");for (String language : programmingLanguages) {System.out.println(language);}// 方式二:使用IteratorSystem.out.println("=== Iterator ===");Iterator<String> iterator = programmingLanguages.iterator();while (iterator.hasNext()) {String language = iterator.next();System.out.println(language);// 可以在迭代中使用 iterator.remove() 安全地删除当前元素}// 方式三:Java 8 forEach + LambdaSystem.out.println("=== forEach Lambda ===");programmingLanguages.forEach(language -> System.out.println(language));// 或者使用方法引用// programmingLanguages.forEach(System.out::println);// 7. 清空集合programmingLanguages.clear();System.out.println("Is set empty? " + programmingLanguages.isEmpty()); // true}
}

三、与其他Set比较

特性HashSetLinkedHashSetTreeSet
内部实现HashMapLinkedHashMapTreeMap (红黑树)
元素顺序无顺序插入顺序 或 访问顺序 (LRU)自然顺序 或 定制排序
null 元素允许一个 null允许一个 null不允许 (如果使用自然排序)
性能 (add, remove, contains)O(1) (平均情况)略低于 HashSet,但仍是 O(1)O(log n)
使用场景最通用的Set,需要快速查找、去重需要保持插入顺序的Set需要元素自动排序的Set

http://www.xdnf.cn/news/18808.html

相关文章:

  • Linux shell脚本条件循环
  • 基础篇(下):神经网络与反向传播(程序员视角)
  • 【论文阅读 | arXiv 2025 | WaveMamba:面向RGB-红外目标检测的小波驱动Mamba融合方法】
  • Multitouch for mac 触控板手势增强软件
  • Zynq开发实践(Verilog、仿真、FPGA和芯片设计)
  • RAG智能问答为什么需要进行Rerank?
  • 【K8s】整体认识K8s之namespace
  • 低功耗模式DMA数据搬运问题解析
  • 模块测试与低功耗模式全攻略
  • 【Java】springboot的自动配置
  • 谷德红外温度传感器在 3D 打印领域应用探究
  • Rust 登堂 生命周期(一)
  • 纯血鸿蒙下的webdav库
  • 最近遇到的几个JVM问题
  • JVM OOM问题排查与解决思路
  • Flask蓝图:模块化开发的利器
  • HarmonyOS NEXT系列之元服务框架ASCF
  • 第04章 SPSS简介与数据库构建
  • 【机器学习】9 Generalized linear models and the exponential family
  • BQTLOCK 勒索软件即服务出现,拥有复杂的规避策略
  • 大白话解析:多证明验证(Merkle Multi-Proof)​
  • 可视化-模块1-HTML-03
  • 基于SpringBoot的美食分享平台【2026最新】
  • 构建wezzer平台!
  • Indy HTTP Server 使用 OpenSSL 3.0
  • 知识蒸馏 Knowledge Distillation 1. 监督式微调(SFT):极大似然是前向 KL 的特例
  • Grafana k6 性能测试
  • 深度模块化剖析:构建一个健壮的、支持动态Cookie和代理的Python网络爬虫
  • 保姆级Maven安装与配置教程(Windows版)
  • 基于 MATLAB 的信号处理实战:滤波、傅里叶变换与频谱分析