java.util.HashSet
HashSet
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
构造方法
HashSet();//无参构造
HashSet(Collection<? extends E> c);//创建一个包含指定集合中所有元素的 HashSet,重复元素自动去重。
HashSet(int initialCapacity)
HashSet(int initialCapacity, float loadFactor)
//HashSet 内部实际上是用 HashMap 实现的,元素作为 key,value 是一个固定对象。
//所以这些构造方法本质上是在初始化内部的 HashMap。
哪些 Collection 能使用该方法构造?
- List 系
- ArrayList
- LinkedList
- Vector
- Stack
new HashSet<>(new ArrayList<>());
new HashSet<>(new LinkedList<>());
new HashSet<>(Arrays.asList("A", "B", "A"));
- Set 系
- HashSet
- LinkedHashSet
- TreeSet
不能直接用的
HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap 等 Map 实现类本身
数组(String[] 等),数组不是 Collection
常用方法
public boolean add(E e);//添加元素
public boolean contains(Object o);//查看表中是否有元素o
public int size();//返回表的大小
remove(Object o);//删除指定元素,成功返回 true,不存在返回 false。
//注意删除指定元素还可以用 Interator.remove() 删除
public void clear();//清除表中所有元素
遍历 HashSet 的几种方式
HashSet 存的是不重复元素,但无序(不保证插入顺序)。遍历方式主要有 4 种:
1. 增强 for 循环(最常用,推荐)
HashSet<String> set = new HashSet<>();
set.add("java");
set.add("c");
set.add("python");
for (String s : set) { // 读作“对 set 里的每个 s”
System.out.println(s);
}
这种写法和 C 的 for (int i=0; ...) 不同,它是迭代器语法糖,不能按索引访问(HashSet 本来也没有索引)。
2. 显式迭代器 Iterator
Iterator<String> it = set.iterator(); // 拿到迭代器
while (it.hasNext()) { // 还有下一个吗?
String s = it.next(); // 取出下一个
System.out.println(s);
}
唯一的刚需场景:遍历中删除元素(增强 for 里删会抛 ConcurrentModificationException):
Iterator<String> it = set.iterator();
while (it.hasNext()) {
if (it.next().equals("c")) {
it.remove(); // 只能用迭代器自己的 remove
}
}
3. forEach + Lambda(Java 8+)
set.forEach(s -> System.out.println(s));
// 或方法引用,更简洁
set.forEach(System.out::println);
4. 转 Stream(要加工数据时用)
set.stream()
.filter(s -> s.length() > 1)
.forEach(System.out::println);

浙公网安备 33010602011771号