collections.sort() 方法未生效(JDK1.7)

4 阅读1分钟

问题描述:

需要对实体类中的两个字段进行排序, 先判断年龄, 如果年龄相等, 再判断姓名;
而通过 collections 类的 sort 方法对 ArrayList 进行排序发现没有生效,也没有报错。

原因分析:

发现是由于当前项目使用的是 JDK 1.7 版本, Comparator 返回值必须是一对相反数,如 1-1,因为 JDK 1.7 的排序算法采用 timsort,对返回值有严格要求;

而在 JDK 8 中, 返回值可以是 0、正数或负数;

解决方案:

Collections.sort(personList, new Comparator<Person>() {
  @Override
  publicintcompare(Person p1, Person p2) {
    if (p1.age > p2.age) {
      return 1;
    } else if (p1.age < p2.age) {
      // JDK 1.7 中必须返回 -1,而不是 0
      return -1;
    } else {
      // 年龄相等时,调用String中的compareTo()方法比较姓名
      return p1.name.compareTo(p2.name);
    }
  }
});