Java Set集合类的用法(附带实例)
Java 中的 Set 是 Collection 的子接口,Set 接口对象类似于数学上的集合概念,其中不允许有重复的元素,并且元素在表中没有顺序要求,所以 Set 集合也称为无序列表。
Set 接口没有定义新的方法,只包含从 Collection 接口继承的方法。Set 接口有几个常用的实现类,层次关系如下图所示。

图 1 Set 接口及实现类的层次结构
Set 接口常用的实现类有 HashSet 类、TreeSet 类和 LinkedHashSet 类。
HashSet 类的构造方法有以下几种:
LinkedHashSet 类是 HashSet 类的子类,与 HashSet 类的不同之处是它对所有元素维护一个双向链表,该链表定义了元素的迭代顺序,这个顺序是元素插入集合的顺序。
【实例 1】创建一个类 HashSetDemo,测试 HashSet 类的用法。
最后使用增强的 for 循环输出集合当中的元素。由于 HashSet 集合当中的元素是无序的,故使用 for 循环输出集合当中的元素时,输出结果也是随机的。该程序每次运行时,结果或许都不一样。另外,因为使用了 HashSet 类,并不保证集合中元素的顺序。
SortedSet 接口中定义了下面几个方法:
TreeSet 类是 SortedSet 接口的实现类,使用红黑树存储元素排序,基于元素的值对元素排序,操作要比 HashSet 类慢。
TreeSet 类的构造方法有以下几种:
【实例 2】创建一个 TreeSetDemo 类,测试 TreeSet 类的用法。
Set 接口没有定义新的方法,只包含从 Collection 接口继承的方法。Set 接口有几个常用的实现类,层次关系如下图所示。

图 1 Set 接口及实现类的层次结构
Set 接口常用的实现类有 HashSet 类、TreeSet 类和 LinkedHashSet 类。
Java HashSet和LinkedHashSet类
HashSet 类是抽象类 AbstractSet 的子类,实现了 Set 接口。HashSet 类使用哈希方法存储元素,具有最好的性能,但元素没有顺序。HashSet 类的构造方法有以下几种:
- HashSet():创建一个空的哈希集合,装填因子(load factor)是 0.75;
- HashSet(Collection c):用指定的集合 c 的元素创建一个哈希集合;
- HashSet(int initialCapacity):创建一个哈希集合,并指定的集合初始容量;
- HashSet(int initialCapacity, float loadFactor):创建一个哈希集合,并指定的集合初始容量和装填因子。
LinkedHashSet 类是 HashSet 类的子类,与 HashSet 类的不同之处是它对所有元素维护一个双向链表,该链表定义了元素的迭代顺序,这个顺序是元素插入集合的顺序。
【实例 1】创建一个类 HashSetDemo,测试 HashSet 类的用法。
import java.util.HashSet; public class HashSetDemo { public static void main(String[] args) { boolean r; HashSet<String> s = new HashSet<String>(); r = s.add("Hello"); System.out.println(" 添加单词 Hello, 返回为 " + r); r = s.add("Kitty"); System.out.println(" 添加单词 Kitty, 返回为 " + r); r = s.add("Hello"); System.out.println(" 添加单词 Hello, 返回为 " + r); r = s.add("java"); System.out.println(" 添加单词 java, 返回为 " + r); System.out.println(" 遍历集合中的元素:"); for(String element : s) System.out.println(element); } }程序执行结果为:
添加单词 Hello, 返回为 true
添加单词 Kitty, 返回为 true
添加单词 Hello, 返回为 false
添加单词 java, 返回为 true
遍历集合中的元素:
java
Hello
Kitty
最后使用增强的 for 循环输出集合当中的元素。由于 HashSet 集合当中的元素是无序的,故使用 for 循环输出集合当中的元素时,输出结果也是随机的。该程序每次运行时,结果或许都不一样。另外,因为使用了 HashSet 类,并不保证集合中元素的顺序。
Java SortedSet接口和TreeSet类
SortedSet 接口是有序对象的集合,其中的元素排序规则按照元素的自然顺序排列。为了能够使元素排序,要求插入 SortedSet 对象中的元素必须是相互可以比较的。SortedSet 接口中定义了下面几个方法:
- E first():返回有序集合中的第一个元素;
- E last():返回有序集合中的最后一个元素;
- SortedSet <E> subSet(E fromElement, E toElement):返回有序集合中的一个子有序集合,元素从 fromElement 开始到 toElement 结束(不包括最后元素);
- SortedSet <E> headSet(E toElement):返回有序集合中小于指定元素 toElement 的一个子有序集合;
- SortedSet <E> tailSet(E fromElement):返回有序集合中大于或等于 fromElement 元素的子有序集合;
- Comparator<? Super E> comparator():返回与该有序集合相关的比较器,如果集合使用自然顺序则返回 null。
TreeSet 类是 SortedSet 接口的实现类,使用红黑树存储元素排序,基于元素的值对元素排序,操作要比 HashSet 类慢。
TreeSet 类的构造方法有以下几种:
- TreeSet():创建一个空的树集合;
- TreeSet(Collection c):用指定集合 c 中的元素创建一个新的树集合,集合中的元素是按照元素的自然顺序排序;
- TreeSet(Comparator c):创建一个空的树集合,元素的排序规则按给定的 c 的规则排序;
- TreeSet(SortedSet s):用 SortedSet 对象 s 中的元素创建一个树集合,排序规则与 s 的排序规则相同。
【实例 2】创建一个 TreeSetDemo 类,测试 TreeSet 类的用法。
import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { boolean r; TreeSet<String> s = new TreeSet<String>(); r = s.add("Hello"); System.out.println(" 添加单词 Hello, 返回为 " + r); r = s.add("Kitty"); System.out.println(" 添加单词 Kitty, 返回为 " + r); r = s.add("Hello"); System.out.println(" 添加单词 Hello, 返回为 " + r); r = s.add("java"); System.out.println(" 添加单词 java, 返回为 " + r); System.out.println(" 遍历集合中的元素:"); for(String element : s) System.out.println(element); } }程序执行结果为:
添加单词 Hello, 返回为 true
添加单词 Kitty, 返回为 true
添加单词 Hello, 返回为 false
添加单词 java, 返回为 true
遍历集合中的元素:
Hello
Kitty
java