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,则会出现一些问题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }