Java 中的 HashSet 底层实现
创始人
2024-12-26 10:43:00
0

Java 中的 HashSet 底层实现

  • 1、HashSet 的底层实现
  • 2、 HashSet 的特点
  • 3、 总结


💖The Begin💖点点关注,收藏不迷路💖

HashSet 是 Java 集合框架中的一个重要成员,它提供了不存储重复元素的集合。但是,你有没有好奇过 HashSet 是如何实现这一特性的呢?本文将带你深入了解 HashSet 的底层实现机制。

1、HashSet 的底层实现

HashSet 的实现是基于 HashMap 的。当我们创建一个 HashSet 对象时,实际上是在背后初始化了一个 HashMap 对象。

但是,HashSet 和 HashMap 的使用方式并不完全相同,这是因为 HashSet 隐藏了 HashMap 的某些复杂性,只暴露了简单的集合操作接口。

HashSet 不允许值重复,这是如何实现的呢? 关键在于 HashSet 是如何存储其元素的。在 HashSet 中,元素是作为 HashMap 的 key 存储的,而 HashMap 的 value 则是一个固定的对象(在 Java 8 及以后的版本中,这个固定的对象通常是一个名为 PRESENT 的静态常量对象)。

示例:

package com.mypackage;  import java.util.HashMap; import java.util.Map;  public class MyHashSet {     // 使用 HashMap 存储元素,这里将 key 视为 HashSet 中的元素     private Map map;      // 静态常量,模拟 HashSet 中的 PRESENT     private static final Object PRESENT = new Object();      // 构造函数,初始化 HashMap     public MyHashSet() {         map = new HashMap<>();     }      // 添加元素到 HashSet 中     public boolean add(E e) {         // 如果 put 方法返回 null,表示该 key 尚未在 HashMap 中存在         return map.put(e, PRESENT) == null;     }      // 从 HashSet 中移除元素     public boolean remove(E e) {         // 如果 remove 方法返回 true,表示该 key 在 HashMap 中存在并且已被移除         return map.remove(e) != null;     }      // 检查 HashSet 是否包含某个元素     public boolean contains(E e) {         // 如果 get 方法返回非 null 值,表示该 key 在 HashMap 中存在         return map.containsKey(e);     }      // 为了展示 HashSet 的内容,我们提供一个简单的方法来打印它     public void printSet() {         for (E e : map.keySet()) {             System.out.println(e);         }     }      // 主函数,用于测试 MyHashSet     public static void main(String[] args) {         MyHashSet myHashSet = new MyHashSet<>();         myHashSet.add("apple");         myHashSet.add("banana");         myHashSet.add("apple"); // 这将不会添加,因为 "apple" 已经存在         System.out.println(myHashSet.contains("apple")); // 输出:true         System.out.println(myHashSet.contains("orange")); // 输出:false         myHashSet.remove("banana");         myHashSet.printSet(); // 输出:apple     } }  

在这里插入图片描述

2、 HashSet 的特点

  • 无序性:HashSet 不保证元素的迭代顺序与插入顺序相同。这是因为 HashSet 是基于 HashMap 实现的,而 HashMap 本身不保证映射的顺序。
  • 元素唯一性:HashSet 中的元素是唯一的,不允许重复。这是通过 HashMap 的 key 唯一性保证的。
  • 性能:HashSet 的查找、添加和删除操作的时间复杂度通常为 O(1),但在最坏的情况下可能会达到 O(n)(当哈希冲突严重,导致链表或红黑树过长时)。

3、 总结

HashSet 的底层实现是基于 HashMap 的,通过利用 HashMap 的 key 唯一性来保证集合中元素的唯一性。HashSet 隐藏了 HashMap 的复杂性,只提供了简单的集合操作接口,使得我们可以更加方便地使用它来处理不重复的元素集合。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关内容

热门资讯

科技新动态!开心跑得快有辅助工... 科技新动态!开心跑得快有辅助工具吗(透明挂)外挂透明挂辅助神器(2021已更新)(哔哩哔哩)1)开心...
4分钟实锤!吉祥麻将,微扑克切... 4分钟实锤!吉祥麻将,微扑克切实是真的有挂,介绍教程(有挂揭秘);一、吉祥麻将AI软件牌型概率发牌机...
实测发现!鄂州晃晃外 挂(透视... 实测发现!鄂州晃晃外 挂(透视)透视辅助工具(2021已更新)(哔哩哔哩)1、鄂州晃晃外 挂系统规律...
三分钟了解!好彩麻将怎样才可以... 三分钟了解!好彩麻将怎样才可以拿好牌(透视辅助)外挂透明挂辅助机制(2020已更新)(哔哩哔哩)1、...
九分钟辅助!斗棋辅助器在哪,w... 九分钟辅助!斗棋辅助器在哪,wepoker本来真的是有挂,教你攻略(有挂教程)1、下载好斗棋辅助器在...
记者揭秘!!广东雀神麻雀辅助器... 记者揭秘!!广东雀神麻雀辅助器在哪里下载(透视)透视辅助app(2020已更新)(哔哩哔哩)1、很好...
终于清楚!皮皮跑胡子输赢规律(... 终于清楚!皮皮跑胡子输赢规律(辅助挂)外挂透明挂辅助机制(2026已更新)(哔哩哔哩)1)皮皮跑胡子...
二分钟科普!花城牌舍系统规律,... 二分钟科普!花城牌舍系统规律,aAPOKER竟然存在有挂,揭秘教程(有挂插件)进入游戏-大厅左侧-新...
一分钟教你!心悦手机麻将辅牌器... 一分钟教你!心悦手机麻将辅牌器(透视辅助)外挂透视辅助挂(2024已更新)(哔哩哔哩)1、每一步都需...
科技新动态!四方河南麻将赢牌技... 科技新动态!四方河南麻将赢牌技巧(透视)外挂透明挂辅助神器(2026已更新)(哔哩哔哩)1、每一步都...