Comparable Comparator Java提供比较功能的两种方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CmdSmith/article/details/78960694

Java有两种方式来提供比较功能。

1)实现 java.lang.Comparable接口

    实现这个接口使你的类具有“天生”比较的功能。这个接口只有一个 compareTo() 方法,接受一个Object参数,如果当前对象小于参数则返回负值,如果相等则返回零,如果当前对象大于参数则返回正值。

2)使用 java.util.Comparator 接口

    如果有人给你一个并没有实现Comparable的类,或者你的类实现了Comparable,但是你不喜欢它的实现方式,需要另外一种不同的比较方法(总之就是不能使用Comparable),可以创建一个实现了Comparator接口的单独的类。这是策略设计模式的一个应用实例。这个类有compare()和equals()两个方法。除非有特殊的性能需要,一般只重写compare()方法就可以了。


Arrays.sort()用来排序数组,可以直接排序元素实现了Comparable接口的数组。如七种基本类型(包装类)String类型。如果元素没有实现Comparable接口,多个元素进行排序时抛出ClassCastException。

Arrays.sort(T[] a, Comparator<? super T> c) 这个重载方法便是提供给元素没有实现Comparable接口的使用。当然实现了Comparable也可以用这个,在判断上有Comparator就不用Comparable。

注意:对于基本类型排序用快速排序,对于引用类型排序用稳定的归并排序,所以不必担心其性能问题。


Collections.sort(List<T> list) 和 Collections.sort(List<T> list, Comparator<? super T> c) 便是与Arrays.sort()类似的两种方式。


不传入Comparator 参数的TreeSet、TreeMap、ConcurrentSkipListSet、ConcurrentSkipListMap、PriorityQueue、PriorityBlockingQueue构造器,元素必须实现Comparable接口。


DelayQueue它的元素必须实现 Delayed 接口,Delayed接口继承了Comparable<Delayed> 接口,不能用 Comparator。




猜你喜欢

转载自blog.csdn.net/CmdSmith/article/details/78960694