关于collection排序,如何理解下面两句话呢?

2019-01-02 21:24发布

问题:

对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。

注意如果要正确实现 Set 接口则 set 维护的顺序(无论是否提供了显式比较器)必须与 equals 一致。

回答1:

1、Collectons 类使用 sort方法时,有两个方法。

<T extends Comparable<? super T>>
void
sort(List<T> list)
          根据元素的自然顺序 对指定列表按升序进行排序。
static
<T> void
sort(List<T> list, Comparator<? super T> c)
          根据指定比较器产生的顺序对指定列表进行排序。

第一个方法中排序使用自然顺序,传入了继承Comparble 的list

2、再来看Comparable

  此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

  也就是Comparable  默认使用 CompareTo方法作排序(自然顺序)。

 3、对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。
 也就是说保证 e1.compareTo(e2) == 0和e1.equals(e2) 得到的结果相同。
4、它的作用在于
    如果我们向 set中插入a元素与b元素
    假如(!a.equals(b) && a.compareTo(b) == 0)
我们表面看a.equals(b)为fales ,ab不同可以全部插入
事实上a.compareTo(b) == 0 为true ,在set看来ab是相同的,无法全部插入,会造成第二个元素插入失败。



标签: