一、Hashset
**在Hashset中如果要添加值,会默认比较这两个值的equals方法
如果通过比较相等,那么就不会添加(而是过滤)。
但是Student类是自己新写的类,所以默认调用它的equals方法实际上是调用它的父类(Object)的equals方法默认比较的是地址,这样会有重复值,所以要重写他的equals和hashcode方法
**
/**
* 不带范行取值,无序,没有下标,没有重复值(过滤)
*/
// Set set=new HashSet();
// set.add(7);
// set.add(2);
// set.add(3);
// set.add(4);
// set.add(5);
// set.add(6);
// for (Object s : set) {
// System.out.println(s);
// }
/**
* 带对象并且重写hashCode&&equals
*/
// Set<Student> set=new HashSet<Student>();
// set.add(new Student(1, "ls", "M"));
// set.add(new Student(2, "ww", "F"));
// set.add(new Student(3, "mz", "M"));
// set.add(new Student(1, "ls", "M"));
// System.out.println(set.size());
// for (Student s : set) {
// System.out.println(s);
// }
二、TreeSet
规则1,实现 Serializable和元素Comparable<Student<>
实现里面的compareTO方法进行比较,compareTO里面传一个参是因为和当前类做比较
public class Student implements Serializable,Comparable<Student>
public int compareTo(Student o) {
if (this.sid!=o.getSid()) {
return this.sid-o.getSid();
}
else if(this.sname!=o.getSname()) {
return this.sname.hashCode()-o.getSname().hashCode();
}
else {
if (this.sex!=o.getSex()) {
return this.sex.hashCode()-o.getSex().hashCode();
}
}
return 0;
}
/**
* 实现 Serializable和元素Comparable<Student>
* 就可以进行排序(根据id排序)
*/
// Set<Student> set=new TreeSet<Student>();
// set.add(new Student(1, "lc", "F"));
// set.add(new Student(3, "ww", "M"));
// set.add(new Student(2, "zs", "M"));
// for (Student s : set) {
// System.out.println(s);
// }
规则2,compare里面两个参做比较
public class Test implements Serializable,Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
if (!o1.equals(o2)) {
return o1.compareTo(o2);
}
return 0;
}
}
/**
* 重新new一个类去比较
*/
// Set<Student> set=new TreeSet<>(new Test());
// set.add(new Student(1, "lc", "F"));
// set.add(new Student(3, "ww", "M"));
// set.add(new Student(2, "zs", "M"));
// for (Student s : set) {
// System.out.println(s);
// }