HashSet

Java 中的 HashSet 使用、方法与属性

Java 中的 HashSet 是基于哈希表实现的 Set 接口的一个实现类。它不允许重复元素,并且不保证元素的顺序。HashSet 的底层实现依赖于 HashMap,其内部使用 HashMap 来存储元素,其中键(Key)用于存储实际元素,值(Value)是一个静态的 Object 对象(通常为 PRESENT)。

主要特性:
  • 无序性HashSet 不保证元素存储顺序与插入顺序一致。
  • 非线性程安全HashSet 不是线程安全的数据结构,如果在多线程环境中使用,需自行同步。
  • 允许 null 元素HashSet 允许有一个 null 元素。
  • 时间复杂度接近 O(1):添加、删除和查找操作的时间复杂度平均为 O(1)。
常用方法:
  • boolean add(E e):将指定的元素添加到 HashSet 中,若集合中已存在该元素则不添加。
  • boolean remove(Object o):从集合中移除指定的元素(如果存在)。
  • boolean contains(Object o):判断集合是否包含指定的元素。
  • int size():返回集合中的元素数量。
  • void clear():移除集合中的所有元素。
  • Iterator<E> iterator():返回集合的迭代器。
示例代码:
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Orange");
        System.out.println(set); // 输出顺序不固定

        set.remove("Banana");
        System.out.println(set.contains("Orange")); // true
        System.out.println(set.size()); // 2
    }
}

C# 中的 HashSet 使用、方法与属性

C# 中的 HashSet<T> 是 .NET Framework 提供的一个集合类,位于 System.Collections.Generic 命名空间中。它同样基于哈希表实现,提供快速的查找、插入和删除操作。

主要特性:
  • 唯一性HashSet<T> 中的元素不可重复。
  • 无序性:元素的顺序不被保留。
  • 性能高效:查找、插入和删除操作的时间复杂度接近 O(1)。
  • 支持 LINQ 操作:可以使用 LINQ 查询语法进行集合运算。
常用方法:
  • bool Add(T item):将指定元素添加到集合中;若已存在则返回 false
  • bool Remove(T item):移除指定元素。
  • bool Contains(T item):判断集合是否包含指定元素。
  • void Clear():移除所有元素。
  • int Count:获取集合中元素的数量。
  • IEnumerator<T> GetEnumerator():获取遍历集合的枚举器。
示例代码:
using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        HashSet<string> hashSet = new HashSet<string>();
        hashSet.Add("Apple");
        hashSet.Add("Banana");
        hashSet.Add("Orange");

        foreach (var item in hashSet) {
            Console.WriteLine(item); // 输出顺序不固定
        }

        hashSet.Remove("Banana");
        Console.WriteLine(hashSet.Contains("Orange")); // True
        Console.WriteLine(hashSet.Count); // 2
    }
}

总结对比

特性Java HashSetC# HashSet
元素唯一性
有序性❌(无序)❌(默认无序)
线程安全性❌(非线程安全)❌(非线程安全)
支持 null 元素✅(仅允许一个 null)✅(允许 null)
查找效率O(1)O(1)
是否基于 HashMap✅(基于 HashMap 实现)✅(内部使用哈希机制)

思维导图

在这里插入图片描述

### HashSet 介绍 HashSetJava 集合框架中的一个类,它实现了 Set 接口,基于哈希表(实际上是一个 HashMap 实例)来存储元素。HashSet 不允许存储重复的元素,并且不保证元素的顺序,因为它不维护元素的插入顺序或其他特定顺序。哈希技术是 Java 集合框架的基石,深入理解 HashSet 的实现原理,能提升代码性能,培养底层思维[^1]。 ### 使用方法 #### 1. 创建 HashSet ```java import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { // 创建一个 HashSet 对象 HashSet<String> set = new HashSet<>(); // 使用 with_hasher 方法创建具有指定哈希函数的 HashSet(这里只是示例语法,实际 Java 里不是这种写法) // 假设存在自定义哈希函数 MyHasher // HashSet<String, MyHasher> setWithHasher = HashSet.with_hasher(new MyHasher()); } } ``` #### 2. 添加元素 ```java import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { HashSet<String> set = new HashSet<>(); // 添加元素 boolean result1 = set.add("apple"); boolean result2 = set.add("banana"); boolean result3 = set.add("apple"); // 重复元素,添加失败 System.out.println(result1); // 输出: true System.out.println(result2); // 输出: true System.out.println(result3); // 输出: false } } ``` 这里的 `add` 方法有返回值,如果传入的元素是集合中不存在的新值,返回 `true` 表示添加成功;如果传入的是集合中已存在的重复值,返回 `false` 表示添加失败,其内部实现是适配到 `HashMap` 上完成的,`HashSet` 的 `add` 方法通过 `HashMap.put` 方法的返回结果来判断是否添加成功[^3][^5]。 #### 3. 判断元素是否存在 ```java import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { HashSet<String> set = new HashSet<>(); set.add("apple"); boolean contains = set.contains("apple"); System.out.println(contains); // 输出: true } } ``` #### 4. 删除元素 ```java import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { HashSet<String> set = new HashSet<>(); set.add("apple"); boolean removed = set.remove("apple"); System.out.println(removed); // 输出: true } } ``` #### 5. 遍历元素 ```java import java.util.HashSet; import java.util.Iterator; public class HashSetExample { public static void main(String[] args) { HashSet<String> set = new HashSet<>(); set.add("apple"); set.add("banana"); // 使用迭代器遍历 Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } // 使用增强 for 循环遍历 for (String element : set) { System.out.println(element); } } } ``` ### 相关技术细节 - **哈希函数**:`HashSet` 依赖于元素的 `hashCode` 方法来确定元素在哈希表中的存储位置。`Object` 类的 `hashCode` 方法返回的哈希码具有地址唯一性,但为了让程序的运行逻辑符合现实生活(即属性相同的对象被看作同一个对象),`Object` 的子类通常会重写 `hashCode` 方法,基本数据类型的实现类都已经重写了 `hashCode` 和 `equals` 方法,自定义的类需要开发者自己重写这两个方法[^4]。 - **内部实现**:`HashSet` 内部使用 `HashMap` 来存储元素,`HashSet` 的元素作为 `HashMap` 的键,而 `HashMap` 的值则是一个固定的对象。`HashSet` 的操作实际上是适配到 `HashMap` 上完成的,例如 `HashSet` 的 `add` 方法通过 `HashMap` 的 `put` 方法来实现[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值