Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但set集合中不能包含重复对象。
Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection
接口的所有方法。
Set的构造有一个约束条件,传入的Collection对象不能有重复值,必须小心操作可变对象。如果一个Set
中的可变元素改变了自身状态导致Object.equals(Object)=true,则会出现一些问题。
Set接口常用的实现类有HashSet类与TreeSet类
HashSet类实现Set接口,由哈希表支持。它不保证Set的迭代顺序,特别是它不保证该顺序恒久不变。此类允许
使用null元素。
TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的
Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用
TreeSet集合中的对象进行排序。
例如:在项目中创建UpdateStu,实现Comparable接口,重写该接口的compareTo()方法。在主方法中创建Update对象,创建集合,并将UpdateStu对象添加到集合中。遍历集合中的全部元素,以及通过headSet()、subSet()方法获得的部分集合。
import java.util.Iterator;
import java.util.TreeSet;
public class UpdateStu implements Comparable<Object>{
String name;
long id;
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 UpdateStu(String name, long id) {
this.name = name;
this.id = id;
}
@Override
public int compareTo(Object o) {
UpdateStu upstu = (UpdateStu)o;
int result = id>upstu.id?1:(id==upstu.id?0:-1);
return result;
}
public static void main(String[] args) {
UpdateStu stu1 = new UpdateStu("王同学",01011);
UpdateStu stu2 = new UpdateStu("张同学",01021);
UpdateStu stu3 = new UpdateStu("李同学",01051);
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();//创建迭代器
System.out.println("Set集合中的所有元素:");
while(it.hasNext()){//遍历集合
UpdateStu stu =(UpdateStu)it.next();//it.next()方法返回的是Object对象
System.out.println(stu.getId()+" "+stu.getName());
}
//first方法:返回此Set集合中当前第一个元素
System.out.println("Set集合中第一个元素:");
System.out.println(tree.first().getId()+" "+tree.first().getName());
//headSet方法:返回一个新的集合,新集合是之前的所有对象
it = tree.headSet(stu2).iterator();
System.out.println("截取前面部分的集合:");
while(it.hasNext()){
UpdateStu stu = (UpdateStu)it.next();
System.out.println(stu.getId()+" "+stu.getName());
}
//subSet(E fromElement,E fromElement)
//返回的是一个新的集合,是fromElement(包含)对象与fromElement(不包含)对象之间的所有对象。
it=tree.subSet(stu2, stu3).iterator();
System.out.println("截取中间部分的集合:");
while(it.hasNext()){
UpdateStu stu = (UpdateStu)it.next();
System.out.println(stu.getId()+" "+stu.getName());
}
}
}
运行结果: