# Set基础

作者:Ethan.Yang
博客:https://blog.ethanyang.cn (opens new window)


Set 接口是 Java 集合框架中用于表示无重复元素集合的接口。与 List 不同,Set 不保证元素的顺序(除了 LinkedHashSetTreeSet 的特定顺序),且不允许重复元素。

# 一、HashSet

# 特点:

  • 底层基于 HashMap 实现。
  • 元素 无序不重复
  • 允许存储 null(只能存一个)。

# 应用场景:

  • 快速去重。
  • 不关注元素顺序的集合存储场景。

# 常用API:

  • add(E e):添加元素
  • remove(Object o):删除元素
  • contains(Object o):判断是否存在
  • size():获取集合大小

# 示例代码:

import java.util.HashSet;

public class HashSetDemo {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Java");
        set.add("Python");
        set.add("Java"); // 重复元素无效

        System.out.println("HashSet内容:" + set);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 二、LinkedHashSet

# 特点:

  • 继承自 HashSet,底层由 LinkedHashMap 实现。
  • 保证元素的 插入顺序
  • 同样不允许重复元素。

# 应用场景:

  • 需要去重且希望保留插入顺序的场景,如缓存数据记录。

# 示例代码:

import java.util.LinkedHashSet;

public class LinkedHashSetDemo {
    public static void main(String[] args) {
        LinkedHashSet<String> set = new LinkedHashSet<>();
        set.add("C");
        set.add("A");
        set.add("B");

        System.out.println("插入顺序保留:" + set);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 三、TreeSet

# 特点:

  • 底层基于 红黑树(TreeMap) 实现。
  • 元素自动按 自然顺序自定义比较器 排序。
  • 不允许 null 元素(因无法比较大小)。

# 应用场景:

  • 数据需要自动排序的集合,如排行榜、字典表。

# 示例代码:

import java.util.TreeSet;

public class TreeSetDemo {
    public static void main(String[] args) {
        TreeSet<Integer> set = new TreeSet<>();
        set.add(5);
        set.add(3);
        set.add(7);

        System.out.println("自动排序:" + set); // 输出:[3, 5, 7]
    }
}
1
2
3
4
5
6
7
8
9
10
11
12