1.HashSet
特性
- 不允许重复:如果尝试添加已存在的元素,
add()
方法会返回false
。 - 无序性:元素的迭代顺序可能不是它们被添加的顺序。
- 基于哈希表:
HashSet
使用哈希表来存储元素,因此查找、添加和删除操作的平均时间复杂度都是O(1)。 - 线程不安全:
HashSet
不是线程安全的,如果需要在多线程环境中使用,可以使用Collections.synchronizedSet()
方法将其包装为线程安全的集合,或者使用CopyOnWriteArraySet
(这是线程安全的,但可能在并发修改时性能较差)。 - 空值:
HashSet
允许存储null
值。
基本使用
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("Apple"); // 重复元素,不会被添加
System.out.println(set); // 输出:[Apple, Banana](但顺序可能不同)
}
}
遍历迭代
1.使用for-each循环(增强型for循环)
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
for (String item : set) {
System.out.println(item);
}
2.使用迭代器(Iterator)
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
}
3.使用Java 8的流(Stream)
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
set.stream().forEach(item -> System.out.println(item));
4.使用传统的for(不推荐)
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
String[] array = set.toArray(new String[0]);
for (String item : array) {
System.out.println(item);
}
// 或者,如果你知道集合的大致大小,并希望避免可能的数组复制操作,可以这样做:
String[] arrayWithSize = set.toArray(new String[set.size()]);
for (String item : arrayWithSize) {
System.out.println(item);
}
方法
构造方法
HashSet()
: 构造一个新的空集合,其底层 HashMap
实例的默认初始容量是 16,加载因子是 0.75。HashSet(int initialCapacity)
: 构造一个新的空集合,具有指定的初始容量和默认的加载因子(0.75)。HashSet(int initialCapacity, float loadFactor)
: 构造一个新的空集合,具有指定的初始容量和加载因子。HashSet(Collection<? extends E> c)
: 构造一个包含指定集合中元素的新集合。
基本操作方法
boolean add(E e)
: 如果此集合不包含指定元素,则添加它。boolean remove(Object o)
: 如果此集合包含指定元素,则将其移除。boolean contains(Object o)
: 如果此集合包含指定元素,则返回 true
。int size()
: 返回此集合中的元素数量(集合的容量)。boolean isEmpty()
: 如果此集合不包含任何元素,则返回 true
。void clear()
: 从此集合中移除所有元素。
集合操作方法
boolean addAll(Collection<? extends E> c)
: 如果此集合中尚未包含指定集合中的所有元素,则将它们全部添加到此集合中。boolean removeAll(Collection<?> c)
: 移除此集合中那些也包含在指定集合中的所有元素(可选操作)。boolean retainAll(Collection<?> c)
: 仅保留此集合中也包含在指定集合中的元素(可选操作)。boolean containsAll(Collection<?> c)
: 如果此集合包含指定集合中的所有元素,则返回 true
。
其他方法
boolean equals(Object o)
: 比较此集合与指定对象是否相等。int hashCode()
: 返回此集合的哈希码值(基于元素的哈希码)。Object clone()
: 返回此 HashSet
实例的浅拷贝。String toString()
: 返回此集合的字符串表示形式(包含元素的字符串表示)。