Loading

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 能使用该方法构造?

  1. List 系
  • ArrayList
  • LinkedList
  • Vector
  • Stack
new HashSet<>(new ArrayList<>());
new HashSet<>(new LinkedList<>());
new HashSet<>(Arrays.asList("A", "B", "A"));
  1. 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);
posted @ 2026-09-21 13:47  wsttask  阅读(4)  评论(0)    收藏  举报