集册 Java 提高篇 Java 集合细节(四):保持 compareTo 和 equals 同步

Java 集合细节(四):保持 compareTo 和 equals 同步

欢马劈雪     最近更新时间:2020-08-04 05:37:59

167

在 Java 中我们常使用 Comparable 接口来实现排序,其中 compareTo 是实现该接口方法。我们知道 compareTo 返回 0 表示两个对象相等,返回正数表示大于,返回负数表示小于。同时我们也知道 equals 也可以判断两个对象是否相等,那么他们两者之间是否存在关联关系呢?


    public class Student implements Comparable<Student>{
        private String id;
        private String name;
        private int age;

        public Student(String id,String name,int age){
            this.id = id;
            this.name = name;
            this.age = age;
        }

        public boolean equals(Object obj){
            if(obj == null){
            return false;
            }

            if(this == obj){
                return true;
            }

            if(obj.getClass() != this.getClass()){
                return false;
            }

            Student student = (Student)obj;
            if(!student.getName().equals(getName())){
                return false;
            }

            return true;
        }

        public int compareTo(Student student) {
            return this.age - student.age;
        }

        /** 省略getter、setter方法 */
    }

Student 类实现 Comparable 接口和实现 equals 方法,其中 compareTo 是根据 age 来比对的,equals 是根据 name 来比对的。


     public static void main(String[] args){
            List<Student> list = new ArrayList<>();
            list.add(new Student("1", "chenssy1", 24));
            list.add(new Student("2", "chenssy1", 26));

            Collections.sort(list);   //排序

            Student student = new Student("2", "chenssy1", 26);

            //检索student在list中的位置
            int index1 = list.indexOf(student);
            int index2 = Collections.binarySearch(list, student);

            System.out.println("index1 = " + index1);
            System.out.println("index2 = " + index2);
       }

按照常规思路来说应该两者 index 是一致的,因为他们检索的是同一个对象,但是非常遗憾,其运行结果:


    index1 = 0
    index2 = 1
展开阅读全文