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 HashSet | C# HashSet |
|---|---|---|
| 元素唯一性 | ✅ | ✅ |
| 有序性 | ❌(无序) | ❌(默认无序) |
| 线程安全性 | ❌(非线程安全) | ❌(非线程安全) |
| 支持 null 元素 | ✅(仅允许一个 null) | ✅(允许 null) |
| 查找效率 | O(1) | O(1) |
| 是否基于 HashMap | ✅(基于 HashMap 实现) | ✅(内部使用哈希机制) |
思维导图

2170

被折叠的 条评论
为什么被折叠?



