Set集合
Set集合中的对象不按特的定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复对象.Set集合由Set接口和Set接口的实现类组成.Set接口继承了Collection接口,因此包含Collection接口的所有方法.
注意:
set的构造有一个条件约束,传入的Collection对象不能有重复值,必须小心操作可变对象(Mutable Object).如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true,则会出现一些问题
Set接口常用的实现类有HashSet类与TreeSet类
1.HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例)支持.他不能保证Set的迭代顺序,特别是他不能保证该顺序恒久不变.此类允许使用null元素
2.TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序.TreeSet类新增的方法如下.
例1
在项目中创建类UpdateStu,实现Comparable接口,重写该接口中的compareTo()方法.在主方法中创建UpdateStu对象,创建集合,并将UpdatrStu对象添加到集合中.遍历该集合中的全部元素,以及通过headSet(),subSet()方法获得全部集合.
package Set; import java.util.*; public class UpdateStu implements Comparable<Object> { // 创建类实现Comparable接口 String name; long id; public UpdateStu(String name, long id) { // 构造方法 super(); this.name = name; this.id = id; } public int compareTo(Object o) { UpdateStu upStu = (UpdateStu) o; int result = id > upStu.id ? 1 : (id == upStu.id ? 0 : -1);// 参照代码说明 return result; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getId() { return id; } public void setId(long id) { this.id = id; } public static void main(String[] args) { UpdateStu stu1 = new UpdateStu("赵", 01011); UpdateStu stu2 = new UpdateStu("钱", 01015); // 创建UpdateStu对象 UpdateStu stu3 = new UpdateStu("孙", 01055); UpdateStu stu4 = new UpdateStu("李", 01012); TreeSet<UpdateStu> tree = new TreeSet<>(); tree.add(stu1); // 向集合添加对象 tree.add(stu2); tree.add(stu3); tree.add(stu4); Iterator<UpdateStu> it = tree.iterator(); // Set集合中的所有对象的迭代器 System.out.println("Set集合中的所有元素"); while (it.hasNext()) { // 遍历集合 UpdateStu stu = (UpdateStu) it.next(); System.out.println(stu.getId() + " " + stu.getName()); } it = tree.headSet(stu2).iterator(); // 截取排在stu2对象之前的对象 System.out.println("截取前面部分的集合"); while (it.hasNext()) { // 遍历集合 UpdateStu stu = (UpdateStu) it.next(); System.out.println(stu.getId() + " " + stu.getName()); } it = tree.subSet(stu2, stu3).iterator(); // 截取排在stu2与stu3对象之前的对象 System.out.println("截取中间部分的集合"); while (it.hasNext()) { // 遍历集合 UpdateStu stu = (UpdateStu) it.next(); System.out.println(stu.getId() + " " + stu.getName()); } } }