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

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.dtcms.com/a/348803.html

相关文章:

  • 【MySQL】CRUD基础详解
  • 基于 Redis + JWT 的跨系统身份共享方案
  • HTTP数据之旅:一个网络请求的完整冒险
  • Unity的Cursor.lockState
  • 油雾环境下漏检率↓79%!陌讯多模态检测算法在加油站智能巡检的落地实践
  • VMware Workstation 不可恢复错误:(vcpu-0)
  • 强反射场景漏检率↓89%!陌讯动态感知算法在护目镜合规检测的实战解析
  • 二叉树学习笔记
  • MyBatis 和 MyBatis-Plus对比
  • 【GEE+Python 实战】用 Sentinel-2 监测 2024 年研究区 NDVI 变化(附完整源码与避坑指南)
  • 深入解析十大经典排序算法原理与实现
  • 理想汽车智驾方案介绍 2|MindVLA 方案详解
  • Java 编译器的世界:前端、JIT 与 AOT 的秘密:详解 Java 的编译过程与编译器生态
  • 秦始皇在位时的重要贡献
  • 室联人形机器人:家政服务任务结构化、技术要点、深入应用FPGA的控制系统框架设计(整合版A)
  • Redis 启动的三种方式:从基础到实战配置指南
  • WSL-linux部署IndexTTS 记录(含本地 CUDA/cuDNN 编译依赖说明)
  • 深度剖析Spring AI源码(二):Model抽象层 - “驯服”天下AI的“紧箍咒”
  • 《Linux 网络编程二:UDP 与 TCP 的差异、应用及问题应对》
  • Grafana k6 性能测试
  • golang5字符串
  • Linux驱动之DMA(三)
  • 强光干扰下漏检率↓78%!陌讯动态决策算法在智慧交通违停检测的实战优化
  • 自动化运维之k8s——Kubernetes集群部署、pod、service微服务、kubernetes网络通信
  • SSRF的学习笔记
  • MATLAB 入门:从变量定义到基础绘图的完整上手指南
  • 学习Java25天
  • 杭电oj第2061题:Treasure the new start, freshmen!
  • 今天学习计算机网格技术的TCP,UDP以及OSPF
  • 南科大C++ 第四章(数组,结构体,联合体,枚举)