1.利用TreeSet保存自定义类对象的时候,自定义所在的类一定要实现Comparable接口,如果没有实现这个接口那么就无法区分大小关系,而且在TreeSet中如果要进行排序,那么就要将所有的字段都进行比较,就是说在TreeSet中是依靠comparato()方法返回的是不是0来判断是不是重复元素的。
package practice1;
public class Person implements Comparable{
private String name;
private int age;
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object obj) {
if(!(obj instanceof Person)){
throw new RuntimeException();
Person person = (Person)obj;
if((this.age-person.age)==0){
return this.name.compareTo(person.name);
}
else{
return this.age-person.age;
}
return 0;
}
}
测试代码:
Set<Person> s = new TreeSet<Person>();
Person p1 = new Person("apang",12);
Person p2 = new Person("zhangsan",13);
Person p3 = new Person("zhangsan",13);
s.add(p1);
s.add(p2);
s.add(p3);
Iterator<Person> iterator2 = s.iterator();
while(iterator2.hasNext()){
System.out.println(iterator2.next());
}
输出结果:
Person [name=apang, age=12]
Person [name=zhangsan, age=13]
compareTo() 方法介绍:
compareTo() 方法用于将 Number 对象与方法的参数进行比较。可用于比较 Byte, Long, Integer等。
该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较。
public class Test{
public static void main(String args[]){
Integer x = 5;
System.out.println(x.compareTo(3));
System.out.println(x.compareTo(5));
System.out.println(x.compareTo(8));
}
}
输出结果:
1
0
-1
2.如果是HashSet子类,那么其判断重复数据的方式不是依靠的comparable接口而是Object类之中的两个方法:(1)取得对象的哈希码 hashCode();(2)对象比较:equals(); 这俩个方法均不需要自己编写,在eclipse里面可以使用右键source 选择自动生成。就像生成Getter 和Setter 方法一样
总结:TreeSet 依靠的是Comparable 来区分重复数据;
HashSet 依靠的是hashCode()、equals()来区分重复数据
Set 里面不允许保存重复数据。