14.4 Set集合

1、概述
  Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合,但Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法。
2、Set解耦常用的实现类有HashSet类与TreeSet类
  a、HashSet类实现Set接口,由哈希表(实际上市一个HashMap实例)支持。它不保证Set的迭代书序,特别是他不保证该顺序恒久不变。此类允许使用null元素。
  b、TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定的比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。
3、TreeSet类新增的方法如下表:

方法 功 能 描 述
first() 返回此Set中当前第一个(最低)元素
last() 返回此Set中当前最后一个(最高)元素
comparator() 返回对此Set中的元素进行排序的比较器。如果此Set使用自然顺序,则返回null
headSet(E toElement) 返回一个新的Set集合,新集合时toElement(不包含)之前的所有对象
subSet(E fromElement, E fromElement) 返回一个新的Set集合,是fromElement(包含)对象与fromElement(不包含)对象之间的所有对象
tailSet(E toElement) 返回一个新的Set集合,新集合包含对象fromElement(包含)之后的所有对象


  注意:Set的构造有一个约束条件,传入的Collection对象不能有重复值,必须小心操作可变对象(Mutable Object)。如果一个Set中可变元素改变了自身的状态导致Object.equals(Object)=true,则会出现一些问题。

 1 package com.lzw;
 2 import java.util.Iterator;
 3 import java.util.TreeSet;
 4 
 5 public class UpdateStu implements Comparable<Object>{
 6     String name;
 7     long id;
 8     
 9     public UpdateStu(String name, long id) {    //构造方法
10         this.id = id;
11         this.name = name;
12     }
13     
14     public int compareTo(Object o) {
15         UpdateStu upstu = (UpdateStu) o;
16         int result = id > upstu.id?1:(id==upstu.id?0:-1);    //参照代码说明
17         return result;
18     }
19     
20     public String getName() {
21         return name;
22     }
23     
24     public void setName(String name) {
25         this.name = name;
26     }
27     
28     public long getId() {
29         return id;
30     }
31     
32     public void setId(long id) {
33         this.id = id;
34     }
35     
36     public static void main(String[] args) {
37         UpdateStu stu1 = new UpdateStu("李1",0001);    //创建UpdateStu对象
38         UpdateStu stu2 = new UpdateStu("李2",0002);
39         UpdateStu stu3 = new UpdateStu("李3",0003);
40         UpdateStu stu4 = new UpdateStu("李4",0004);
41         UpdateStu stu5 = new UpdateStu("李5",0005);
42         
43         TreeSet<UpdateStu> tree = new TreeSet<>();
44         tree.add(stu1);
45         tree.add(stu2);
46         tree.add(stu3);
47         tree.add(stu4);
48         tree.add(stu5);
49         
50         Iterator<UpdateStu> it = tree.iterator();    //Set集合中的所有对象的迭代器
51         System.out.println("Set集合中的所有元素:");
52         while(it.hasNext()) {
53             UpdateStu stu = (UpdateStu)it.next();
54             System.out.println(stu.getId() + "  " + stu.getName());
55         }
56         
57         it = tree.headSet(stu2).iterator();     //截取排在stu2对象之前的对象
58         System.out.println("截取前面部分的集合:");
59         while(it.hasNext()) {
60             UpdateStu stu = (UpdateStu)it.next();
61             System.out.println(stu.getId() + "  " + stu.getName());
62         }
63         
64         it = tree.subSet(stu2, stu3).iterator();     //截取排在stu2与stu3之前的对象
65         System.out.println("截取中间部分的集合:");
66         while(it.hasNext()) {
67             UpdateStu stu = (UpdateStu)it.next();
68             System.out.println(stu.getId() + "  " + stu.getName());
69         }
70         
71     }
72 }
View Code
原文地址:https://www.cnblogs.com/studycode/p/9536746.html