set集合。不存在相同的两个元素。无序,存储顺序和取出顺序不一致, HashSet 他的子类 底层依赖两个方法,hashCode()和Equals()
首相比较哈希值 如果相同,继续走,比较地址值或者走equals()
如果不同,就直接添加到集合中。 instanceof 是什么对象 obj instanceof student 注意,对于引用类,所有的hashcode都不会一样,所以不会检测添加的数据是否相同,所以,需要重写hashCode和equals函数。让hashCode处理时候相同的要hashCode要相同。
所以最终解决方案是:返回hashcode的内部返回
例如:return this.name.hashCode()+this.age*15; 成员变量的hashCode,*15是因为防止总值相同的情况, 但是这个不会自己写,所以用系统自动生成的就行, LinkedHashSet 是hashSet的子类、 具有可预知迭代顺序,即顺序有序。 TreeSet 能够对元素按照某种规则进行排序
排序有两种方式 A:自然排序 升序排序
B:比较器排序。 对于引用类,要指明使用哪个变量进行排序,所以,对于要惊醒排序的类,要实现一个接口
implements Comparable<T> 然后重写conparable方法,内部如果比较的规则大就返回大于0,等返回0,小返回小于0,
但是不仅要分析主要条件,还要分析次要条件,主要条件就是规定的按照排序的字段。防止出现主要条件相同,次要条件不同,但是不能添加的情况、
例如 : int num=this.age-s,age;
int num2=num==0?this.age.compareTo(s.name):num;
return num2; - TreeSet<Student> tsSet=new TreeSet<Student>(new Comparator<Student>() {
-
- @Override
- public int compare(Student o1, Student o2) {
- // TODO Auto-generated method stub
- int num1=o1.getName().length()-o2.getName().length();
- int num2=num1==0?o1.getName().compareTo(o2.getName()):num1;
- int num3=num2==0?o1.getAge()-o2.getAge():num2;
- return num3;
- }
-
- });
- Student s1=new Student("meichaofeng", 20);
- Student s2=new Student("yangguo", 22);
- Student s3=new Student("xiaolongnv", 33);
- Student s4=new Student("dongxie", 230);
- Student s5=new Student("xidu", 204);
- Student s6=new Student("nandi", 24);
- Student s7=new Student("beigai", 20);
- Student s8=new Student("yangguo", 22);
-
- tsSet.add(s1);
- tsSet.add(s2);
- tsSet.add(s3);
- tsSet.add(s4);
- tsSet.add(s5);
- tsSet.add(s6);
- tsSet.add(s7);
- tsSet.add(s8);
-
- for (Student student : tsSet) {
- System.out.println(student.toString());
- }
复制代码
比较器排序(集合具备比较性)
让集合的构造方法接收一个比较器接口的子类对象。Comparator
|