set集合中的对象不按特定的方式排序,只是简单的把对象加入集合中,但set集合中不能包含重复对象。set集合由set接口和set接口的实现类组成。set接口继承了collection接口,因此包含collection接口的所有方法。
注意:set的构造有一个约束条件,传入的Collection对象不能有重复的值。
set接口常用的实现类有HashSet类和TreeSet类
- HashSet类实现set接口,由哈希表(实际上是一个HashMap实例)支持。他不保证Set的迭代顺序,特别是它不保证顺序恒久不变。此类允许使用null元素。
- TreeSet类不仅实现了set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增顺序,即可以可以通过比较器对用TreeSet类实现Set集合中的对象进行排序。TreeSet类新增的方法如下:
方法 | 功能描述 |
first() | 返回此Set中当前第一个(最低)元素 |
last() | 返回此Set中当前最后一个(最高)元素 |
comparator() | 返回对此Set中的元素进行排序的比较器,如果此Set使用自然顺序,则返回null |
headSet() | 返回一个新的Set集合,新集合时 toElement(不包含)之前的所有对象 |
subSet(E fromElement, E fromElement) |
返回一个新的set集合,fromElement(包含)对象与fromElement(不包含)对象之间的所有对象 |
tailSet(E fromElement) | 返回一个新的set集合,新集合包含对象fromElement(包含)之后的所有对象 |
在项目中创建类Demo ,实现Comparable接口,重写该接口的compareTo()方法,在主方法中创建Demo对象,创建集合,并将Demo对象添加到集合中,遍历该集合中的全部元素,以及通过headSet(),subSet()方法获得的部分集合
import java.util.Iterator;
import java.util.TreeSet;
public class Demo implements Comparable<Object> {// 创建类实现Comparable接口
String name;
long id;
public Demo(String name, long id) {
this.id = id;
this.name = name;
}
@Override
public int compareTo(Object o) {
Demo demo = (Demo) o;
int result = id > demo.id ? 1 : (id == demo.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) {
Demo demo1 = new Demo("tom", 010111);
Demo demo2 = new Demo("Jack", 020222);// 创建demo对象
Demo demo3 = new Demo("lucky", 030333);
Demo demo4 = new Demo("duvk", 040444);
TreeSet<Demo> tree = new TreeSet<>();
tree.add(demo1); // 向集合中添加对象
tree.add(demo2);
tree.add(demo3);
tree.add(demo4);
Iterator<Demo> it = tree.iterator();// set集合中的所有对象的迭代器
System.out.println("Set集合中的所有元素:");
while (it.hasNext()) {// 遍历集合
Demo demo = (Demo) it.next();
System.out.println(demo.getId() + " " + demo.getName());
}
it = tree.headSet(demo2).iterator();// 截取排在demo2对象之前的对象
System.out.println("截取前面部分的集合:");
while (it.hasNext()) {// 遍历集合
Demo demo = it.next();
System.out.println(demo.getName() + demo.getId());
}
it = tree.subSet(demo2, demo3).iterator();// 截取demo2 demo3之间的对象
System.out.println("截取中间部分的集合:");
while (it.hasNext()) {
Demo demo = it.next();
System.out.println(demo.getName() + " " + demo.getId());
}
}
}
运行结果
代码说明:
存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序。如果该对象小于,等于,或大于指定对象,则分别返回负整数,0或正整数。
技巧:
headSet(),subSet(),tailSet()方法截取对象生成新集合时是否包含指定的参数,可以通过如下方法判别:如果指定参数位于新集合的起始位置,则包含该对象,如:subSet()方法的第一个参数和tailSet()方法的参数;如果指定参数是新集合的终止位置,则不包含该参数,如headSet()方法的入口参数和subSet()方法的第二个入口参数。