TreeSet集合:可以对Set集合中的元素进行排序。是不同步的。
注:TreeSet集合判断元素唯一性的方式就是根据比较方法(compareTo)的返回结果是否是0,如果是0就是相同元素就不存。而不会判断hashCode和equals。
例:
import java.util.Iterator; import java.util.TreeSet; public class TreeSetDemo{ public static void main(String[] args){ TreeSet ts=new TreeSet(); ts.add("abc"); ts.add("zaa"); ts.add("abc"); ts.add("nba"); ts.add("cba"); Iterator it=ts.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }运行结果:
可以看到结果虽然无序,但是按照元素的指定顺序排序(本例中按照字母顺序进行排序)。
当我们在TreeSet集合中添加自定义对象时:
import java.util.Iterator; import java.util.TreeSet; class Person extends Object{ String name; int age; public Person(){ super(); } public Person(String name,int age){ super(); this.name=name; this.age=age; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public int getAge(){ return age; } public void setAge(int age){ this.age=age; } public int hashCode(){ //复写hashCode() return name.hashCode()+age; } public boolean equals(Object obj){ //复写equals if(this==obj) return true; if(!(obj instanceof Person)) throw new ClassCastException("类型错误"); //输入类型错误 Person p = (Person)obj;//强制转换 return this.name.equals(p.name) && this.age==p.age; //说明姓名和年龄相同则为同一元素 } } public class TreeSetDemo{ public static void main(String[] args){ TreeSet ts=new TreeSet(); ts.add(new Person("zhangsan",28)); ts.add(new Person("wangwu",23)); ts.add(new Person("lisi",21)); ts.add(new Person("zhouqi",29)); ts.add(new Person("zhaoliu",25)); Iterator it=ts.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); System.out.println(p.getName()+":"+p.getAge()); } } }运行结果:
程序在主线程上发生了异常,这是因为在TreeSet集合中要对元素进行排序,所以在Person类中要有对元素进行比较的方法,而这个比较方法(compareTo)本身定义在Comparable接口中,因此要让Person类具备比较性,所以要对Person类功能扩展,让其实现Comparable接口,覆盖compareTo方法。
(引申:Comparable接口:此接口强行对实现它的每个类的对象进行整体排序,称为类的自然排序,类的compareTo方法被称为它的自然比较方法。)
修改代码:
import java.util.Iterator; import java.util.TreeSet; class Person extends Object implements Comparable{ //先继承后实现 String name; int age; public Person(){ super(); } public Person(String name,int age){ super(); this.name=name; this.age=age; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public int getAge(){ return age; } public void setAge(int age){ this.age=age; } public int compareTo(Object o){ //以Person对象的年龄进行从小到大的排序 Person p=(Person)o; /* 此部分代码可被下两句代码替换 if(this.age>p.age) return 1; //返回正数 if(this.age<p.age) return -1; //返回负数 if(this.age==p.age){ //当主要条件相等时按次要条件排序 return this.name.compareTo(p.name); //String类中的compareTo方法 } */ int temp=this.age-p.age; //先按年龄排,再按姓名排 return temp==0?this.name.compareTo(p.name):temp; /* 先按姓名排,再按年龄排 int temp=this.name.compareTo(p.name); return temp==0?this.age-p.age:temp; */ } } public class TreeSetDemo{ public static void main(String[] args){ TreeSet ts=new TreeSet(); ts.add(new Person("zhangsan",28)); ts.add(new Person("wangwu",29)); ts.add(new Person("lisi",21)); ts.add(new Person("zhouqi",29)); ts.add(new Person("zhaoliu",25)); Iterator it=ts.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); System.out.println(p.getName()+":"+p.getAge()); } } }
运行结果(先按年龄排,再按姓名排):