Set接口的定义

从定义上可以发现,Set接口与List接口的定义并没有太大的区别。但是Set接口的主要方法与Collection是一致的,也就是说Set接口并没有对Collection接口进行扩充,只是比Collection接口的要求更加严格了,不能增加重复元素。

Set接口的实例无法像List接口那样可以进行双向输出,因为此接口没有提供像List接口定义的get(int index)方法。

 

13.4.2  Set接口的常用子类(1)

1.散列的存放:HashSet

HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序。

范例:验证HashSet类

 
 
  1. package org.lxh.demo13.setdemo;  
  2. import java.util.HashSet;  
  3. import java.util.Set;  
  4. public class HashSetDemo01 {  
  5.     public static void main(String[] args) {  
  6.         Set allSet = new HashSet();  
  7.         allSet.add("A") ;                   // 增加元素  
  8.         allSet.add("B") ;                   // 增加元素  
  9.         allSet.add("C") ;                   // 增加元素  
  10.         allSet.add("C") ;                   // 重复元素,不能加入  
  11.         allSet.add("C") ;                   // 重复元素,不能加入  
  12.         allSet.add("D") ;                   // 增加元素  
  13.         allSet.add("E") ;                   // 增加元素  
  14.         System.out.println(allSet) ;        
    // 输出集合对象,调用toString()  
  15.     }  

程序运行结果:

 
 
  1. [D, A, C, B, E] 

从程序的运行结果中可以清楚地看出,对于重复元素只会增加一次,而且程序运行时向集合中加入元素的顺序并不是集合中的保存顺序,证明HashSet类中的元素是无序排列的。

2.有序的存放:TreeSet

如果想对输入的数据进行有序排列,则要使用TreeSet子类。TreeSet类的定义如下:

 
 
  1. public class TreeSet extends AbstractSet  
  2. implements SortedSet, Cloneable, Serializable  
  3. TreeSet类也是继承了AbstractSet类,此类的定义如下:  
  4. public abstract class AbstractSet  
  5. extends AbstractCollection  
  6. implements Set 

范例:验证TreeSet类

 
 
  1. package org.lxh.demo13.setdemo;  
  2. import java.util.Set;  
  3. import java.util.TreeSet;  
  4. public class TreeSetDemo01 {  
  5.     public static void main(String[] args) {  
  6.         Set allSet = new TreeSet();  
  7.         allSet.add("C") ;                       // 加入元素  
  8.         allSet.add("C") ;                       // 重复元素,不能加入  
  9.         allSet.add("C") ;                       // 重复元素,不能加入  
  10.         allSet.add("D") ;                       // 加入元素  
  11.         allSet.add("B") ;                       // 加入元素  
  12.         allSet.add("A") ;                       // 加入元素  
  13.         allSet.add("E") ;                       // 加入元素  
  14.         System.out.println(allSet) ;            // 
    输出集合,调用toString()
     
  15.     }  

程序运行结果:

 
 
  1. [A, B, C, D, E] 

程序在向集合中插入数据时是没有顺序的,但是输出之后数据是有序的,所以TreeSet是可以排序的子类。

3.关于TreeSet的排序说明

既然TreeSet本身是可以排序的,那么现在定义一个自己的类,是否也可以进行排序的操作呢?

范例:自定义类排序

 
 
  1. package org.lxh.demo13.setdemo;  
  2. import java.util.Set;  
  3. import java.util.TreeSet;  
  4. class Person {                                      // 定义Person类  
  5.     private String name;                            // 定义name属性  
  6.     private int age;                                // 定义age属性  
  7.     public Person(String name, int age) {           // 通过构造方法为属性赋值  
  8.         this.name = name;                           // 为name属性赋值  
  9.         this.age = age;                             // 为age属性赋值  
  10.     }  
  11.     public String toString() {                      // 覆写toString()方法  
  12.         return "姓名:" + this.name + ";年龄:" + this.age;  
  13.     }  
  14. }  
  15. public class TreeSetDemo02 {  
  16.     public static void main(String[] args) {  
  17.         Set allSet = new TreeSet();// 实例化Set集合,类型为  
  18. Person  
  19.         allSet.add(new Person("张三"30));           // 加入元素  
  20.         allSet.add(new Person("李四"31));           // 加入元素  
  21.         allSet.add(new Person("王五"32));           // 加入元素  
  22.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  23.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  24.         allSet.add(new Person("赵六"33));           // 加入元素  
  25.         allSet.add(new Person("孙七"33));       // 年龄重复  
  26.         System.out.println(allSet);                 // 输出集合内容  
  27.     }  

程序运行时出现以下错误:

 
 
  1. Exception in thread "main" java.lang.ClassCastException:
    org.lxh.demo13. setdemo.Person cannot be cast to java.lang.Comparable  
  2.     at java.util.TreeMap.put(Unknown Source)  
  3.     at java.util.TreeSet.add(Unknown Source)  
  4.     at org.lxh.demo13.setdemo.TreeSetDemo02.main(TreeSetDemo02.java:19
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值