Java Comparable和Comparator

http://my.oschina.net/android520/blog/700738

Comparable接口,只要类继承该接口,就可以实现对象的排序功能。

Comparator接口,可以用来对已有的未继承Comparable接口的,进行排序。

sort方法,在JDK6和JDK7中实现方式不一样,具体如下:

来自http://blog.sina.com.cn/s/blog_8e6f1b330101h7fa.html

在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,内部实现换成了TimSort,其对对象间比较的实现要求更加严格:

Comparator的实现必须保证以下几点(出自这儿):

a). sgn(compare(x, y)) == -sgn(compare(y, x))
b). (compare(x, y)>0) && (compare(y, z)>0) 意味着 compare(x, z)>0
c). compare(x, y)==0 意味着对于任意的z:sgn(compare(x, z))==sgn(compare(y, z)) 均成立

而我们的代码中,某个compare()实现片段是这样的:

这就违背了a)原则:假设X的value为1,Y的value也为1;那么compare(X, Y) ≠ –compare(Y, X)
PS: TimSort不仅内置在各种JDK 7的版本,也存在于Android SDK中(尽管其并没有使用JDK 7)。

下面看下sort方法中的具体排序源码

从代码中可以看出使用的是二分法排序binarySort