从定义上可以发现,Set接口与List接口的定义并没有太大的区别。但是Set接口的主要方法与Collection是一致的,也就是说Set接口并没有对Collection接口进行扩充,只是比Collection接口的要求更加严格了,不能增加重复元素。
Set接口的实例无法像List接口那样可以进行双向输出,因为此接口没有提供像List接口定义的get(int index)方法。
13.4.2 Set接口的常用子类(1)
1.散列的存放:HashSet
HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序。
范例:验证HashSet类
- package org.lxh.demo13.setdemo;
- import java.util.HashSet;
- import java.util.Set;
- public class HashSetDemo01 {
- public static void main(String[] args) {
- Set allSet = new HashSet();
- allSet.add("A") ; // 增加元素
- allSet.add("B") ; // 增加元素
- allSet.add("C") ; // 增加元素
- allSet.add("C") ; // 重复元素,不能加入
- allSet.add("C") ; // 重复元素,不能加入
- allSet.add("D") ; // 增加元素
- allSet.add("E") ; // 增加元素
- System.out.println(allSet) ;
// 输出集合对象,调用toString()- }
- }
程序运行结果:
- [D, A, C, B, E]
从程序的运行结果中可以清楚地看出,对于重复元素只会增加一次,而且程序运行时向集合中加入元素的顺序并不是集合中的保存顺序,证明HashSet类中的元素是无序排列的。
2.有序的存放:TreeSet
如果想对输入的数据进行有序排列,则要使用TreeSet子类。TreeSet类的定义如下:
- public class TreeSet extends AbstractSet
- implements SortedSet, Cloneable, Serializable
- TreeSet类也是继承了AbstractSet类,此类的定义如下:
- public abstract class AbstractSet
- extends AbstractCollection
- implements Set
范例:验证TreeSet类
- package org.lxh.demo13.setdemo;
- import java.util.Set;
- import java.util.TreeSet;
- public class TreeSetDemo01 {
- public static void main(String[] args) {
- Set allSet = new TreeSet();
- allSet.add("C") ; // 加入元素
- allSet.add("C") ; // 重复元素,不能加入
- allSet.add("C") ; // 重复元素,不能加入
- allSet.add("D") ; // 加入元素
- allSet.add("B") ; // 加入元素
- allSet.add("A") ; // 加入元素
- allSet.add("E") ; // 加入元素
- System.out.println(allSet) ; //
输出集合,调用toString()- }
- }
程序运行结果:
- [A, B, C, D, E]
程序在向集合中插入数据时是没有顺序的,但是输出之后数据是有序的,所以TreeSet是可以排序的子类。
3.关于TreeSet的排序说明
既然TreeSet本身是可以排序的,那么现在定义一个自己的类,是否也可以进行排序的操作呢?
范例:自定义类排序
- package org.lxh.demo13.setdemo;
- import java.util.Set;
- import java.util.TreeSet;
- class Person { // 定义Person类
- private String name; // 定义name属性
- private int age; // 定义age属性
- public Person(String name, int age) { // 通过构造方法为属性赋值
- this.name = name; // 为name属性赋值
- this.age = age; // 为age属性赋值
- }
- public String toString() { // 覆写toString()方法
- return "姓名:" + this.name + ";年龄:" + this.age;
- }
- }
- public class TreeSetDemo02 {
- public static void main(String[] args) {
- Set allSet = new TreeSet();// 实例化Set集合,类型为
- Person
- allSet.add(new Person("张三", 30)); // 加入元素
- allSet.add(new Person("李四", 31)); // 加入元素
- allSet.add(new Person("王五", 32)); // 加入元素
- allSet.add(new Person("王五", 32)); // 重复元素,不能加入
- allSet.add(new Person("王五", 32)); // 重复元素,不能加入
- allSet.add(new Person("赵六", 33)); // 加入元素
- allSet.add(new Person("孙七", 33)); // 年龄重复
- System.out.println(allSet); // 输出集合内容
- }
- }
程序运行时出现以下错误:
- Exception in thread "main" java.lang.ClassCastException:
org.lxh.demo13. setdemo.Person cannot be cast to java.lang.Comparable- at java.util.TreeMap.put(Unknown Source)
- at java.util.TreeSet.add(Unknown Source)
- at org.lxh.demo13.setdemo.TreeSetDemo02.main(TreeSetDemo02.java:19)