当我们排序的对象不止是简单的数据类型的时候 我们可以通过 实现Comparable 和Comparator 接口来完整对 对象的排序 Comparable和Compartor 的区别? Comparable 是一个自身已经支持自比较的(如String Integer) 的接口 Comparator 可以说是一个 专用的比较器 当对象本身 不支持自排序和自比较函数的时候 我们可以通过实现Compartor 来比较两对象的大小 Comparable 是一个比较通用的接口 用户可以通过他实现 排序功能 而 Comparator 可以看作一种算法 一种设计模式 (可以看作是一个策略模式 就是不改变对象自身而用一个策略对象改变对象行为) Comparable 相对比较固定 与具体类绑定 Comparator 比较灵活 可以与任何需要实现功能的类 绑定 Comparable 可以说是 静态绑定 Comparator 可以说是动态绑定 Comparable 此接口强行对实现它的每个类的对象进行整体排序此排序被称为该类的自然排序类的 compareTo 方法被称为它的自然比较方法 实现此接口的对象列表(和数组)可以通过 Collectionssort(和 Arrayssort)进行自动排序实现此接口的对象可以用作有序映射表中的键或有序集合中的元素无需指定比较器 对于类 C 的每一个 e 和 e 来说当且仅当 (pareTo((Object)e) == ) 与 eequals((Object)e) 具有相同的布尔值时类 C 的自然排序才叫做与 equals 一致注意null 不是任何类的实例即使 eequals(null) 返回 falsepareTo(null) 也会抛出 NullPointerException 强烈推荐(虽然不是必需的)使自然排序与 equals 一致这是因为在使用其自然排序与 equals 不一致的元素(或键)时没有显式比较器的有序集合(和有序映射表)行为表现怪异尤其是这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定 而 Comparator 比较函数强行对某些对象 collection 进行整体排序可以将 Comparator 传递给 sort 方法(如 Collectionssort)从而允许在排序顺序上实现精确控制还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序 当且仅当对于一组元素 S 中的每个 e 和 e 而言(compare((Object)e (Object)e)==) 与 eequals((Object)e) 具有相等的布尔值时Comparator c 强行对 S 进行的排序才叫做与等号一致 的排序 当使用具有与等号一致的强行排序能力的 comparator 对有序 set(或有序映射)进行排序时应该小心谨慎假定一个带有显式 Comparator c 的有序 set(或有序映射)与从 set S 中抽取出来的元素(或键)一起使用如果 c 强行对 S 进行的排序与等号一致那么有序 set(或有序映射)将是行为怪异的尤其是那些将违背根据 equals 所定义 set(或映射)的常规协定的有序 set(或有序映射) |