首页 > 编程笔记 > Java笔记 阅读:11

Java Set集合类的用法(附带实例)

Java 中的 Set 是 Collection 的子接口,Set 接口对象类似于数学上的集合概念,其中不允许有重复的元素,并且元素在表中没有顺序要求,所以 Set 集合也称为无序列表。

Set 接口没有定义新的方法,只包含从 Collection 接口继承的方法。Set 接口有几个常用的实现类,层次关系如下图所示。


图 1 Set 接口及实现类的层次结构

Set 接口常用的实现类有 HashSet 类、TreeSet 类和 LinkedHashSet 类。

Java HashSet和LinkedHashSet类

HashSet 类是抽象类 AbstractSet 的子类,实现了 Set 接口。HashSet 类使用哈希方法存储元素,具有最好的性能,但元素没有顺序。

HashSet 类的构造方法有以下几种:
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

程序中先创建一个存放 String 类型的 HashSet 集合对象 s。然后分别向其中添加了 "Hello"、"Kitty"、"Hello"、"java" 这 4 个字符串。由于 Set 类型的集合不能存放重复的数据,故第二次向集合当中存放 "Hello" 字符串时,返回结果为 false。

最后使用增强的 for 循环输出集合当中的元素。由于 HashSet 集合当中的元素是无序的,故使用 for 循环输出集合当中的元素时,输出结果也是随机的。该程序每次运行时,结果或许都不一样。另外,因为使用了 HashSet 类,并不保证集合中元素的顺序。

Java SortedSet接口和TreeSet类

SortedSet 接口是有序对象的集合,其中的元素排序规则按照元素的自然顺序排列。为了能够使元素排序,要求插入 SortedSet 对象中的元素必须是相互可以比较的。

SortedSet 接口中定义了下面几个方法:
TreeSet 类是 SortedSet 接口的实现类,使用红黑树存储元素排序,基于元素的值对元素排序,操作要比 HashSet 类慢。

TreeSet 类的构造方法有以下几种:
【实例 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

与实例 1 不同的是,本例采用 TreeSet 类集合,实现了集合元素的有序输出,但这种实现是有代价的,即集合中的元素需要具有可比性。

相关文章