Comparable与Comparator的区别
Comparable & Comparator 都是用來實(shí)現(xiàn)集合中元素的比較、排序的,只是 Comparable 是在集合內(nèi)部定義的方法實(shí)現(xiàn)的排序,Comparator 是在集合外部實(shí)現(xiàn)的排序,所以,如想實(shí)現(xiàn)排序,就需要在集合外定義 Comparator 接口的方法或在集合內(nèi)實(shí)現(xiàn) Comparable 接口的方法。
Comparator位于包java.util下,而Comparable位于包?? java.lang下
Comparable 是一個(gè)對(duì)象本身就已經(jīng)支持自比較所需要實(shí)現(xiàn)的接口(如 String、Integer 自己就可以完成比較大小操作,已經(jīng)實(shí)現(xiàn)了Comparable接口)
自定義的類要在加入list容器中后能夠排序,可以實(shí)現(xiàn)Comparable接口,在用Collections類的sort方法排序時(shí),如果不指定Comparator,那么就以自然順序排序,如API所說:
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
這里的自然順序就是實(shí)現(xiàn)Comparable接口設(shè)定的排序方式。
而 Comparator 是一個(gè)專用的比較器,當(dāng)這個(gè)對(duì)象不支持自比較或者自比較函數(shù)不能滿足你的要求時(shí),你可以寫一個(gè)比較器來完成兩個(gè)對(duì)象之間大小的比較。
可以說一個(gè)是自已完成比較,一個(gè)是外部程序?qū)崿F(xiàn)比較的差別而已。
用 Comparator 是策略模式(strategy design pattern),就是不改變對(duì)象自身,而用一個(gè)策略對(duì)象(strategy object)來改變它的行為。
比如:你想對(duì)整數(shù)采用絕對(duì)值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實(shí)際上你也不能這么做)去改變它的排序行為,只要使用一個(gè)實(shí)現(xiàn)了 Comparator 接口的對(duì)象來實(shí)現(xiàn)控制它的排序就行了。
| 1 2 3 4 5 6 7 8 9 10 | // AbsComparator.java??? ? import?? java.util.*; public?? class?? AbsComparator?? implements?? Comparator?? {??? ? ????public?? int?? compare(Object?? o1,?? Object?? o2)?? {??? ? ??????int?? v1?? =?? Math.abs(((Integer)o1).intValue());??? ? ??????int?? v2?? =?? Math.abs(((Integer)o2).intValue());??? ? ??????return?? v1?? >?? v2?? ??? 1?? :?? (v1?? ==?? v2?? ??? 0?? :?? -1);??? ? ????}??? ? } |
可以用下面這個(gè)類測(cè)試 AbsComparator:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Test.java??? ? import?? java.util.*;??? ? public?? class?? Test?? {??? ? ????public?? static?? void?? main(String[]?? args)?? {??? ? ??????//產(chǎn)生一個(gè)20個(gè)隨機(jī)整數(shù)的數(shù)組(有正有負(fù))??? ? ??????Random?? rnd?? =?? new?? Random();??? ? ??????Integer[]?? integers?? =?? new?? Integer[20];??? ? ??????for(int?? i?? =?? 0;?? i?? <?? integers.length;?? i++)??? ? ??????integers[i]?? =?? new?? Integer(rnd.nextInt(100)?? *?? (rnd.nextBoolean()?? ??? 1?? :?? -1));??? ? ??????System.out.println("用Integer內(nèi)置方法排序:");??? ? ??????Arrays.sort(integers);??? ? ??????System.out.println(Arrays.asList(integers));??? ? ??????System.out.println("用AbsComparator排序:");??? ? ??????Arrays.sort(integers,?? new?? AbsComparator());??? ? ??????System.out.println(Arrays.asList(integers));??? ? ????}??? ? } |
Collections.sort((List<T> list, Comparator<? super T> c)是用來對(duì)list排序的。
如果不是調(diào)用sort方法,相要直接比較兩個(gè)對(duì)象的大小,如下:
Comparator定義了倆個(gè)方法,分別是?? int?? compare(T?? o1,?? T?? o2)和?? boolean?? equals(Object?? obj),
用于比較兩個(gè)Comparator是否相等
true only if the specified object is also a comparator and it imposes the same ordering as this comparator.
有時(shí)在實(shí)現(xiàn)Comparator接口時(shí),并沒有實(shí)現(xiàn)equals方法,可程序并沒有報(bào)錯(cuò),原因是實(shí)現(xiàn)該接口的類也是Object類的子類,而Object類已經(jīng)實(shí)現(xiàn)了equals方法
Comparable接口只提供了?? int?? compareTo(T ? o)方法,也就是說假如我定義了一個(gè)Person類,這個(gè)類實(shí)現(xiàn)了?? Comparable接口,那么當(dāng)我實(shí)例化Person類的person1后,我想比較person1和一個(gè)現(xiàn)有的Person對(duì)象person2的大小時(shí),我就可以這樣來調(diào)用:person1.comparTo(person2),通過返回值就可以判斷了;而此時(shí)如果你定義了一個(gè)?? PersonComparator(實(shí)現(xiàn)了Comparator接口)的話,那你就可以這樣:
| 1 2 | PersonComparator?? comparator=?? new?? PersonComparator(); comparator.compare(person1,person2); |
from:?http://www.importnew.com/17434.html
總結(jié)
以上是生活随笔為你收集整理的Comparable与Comparator的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntelliJ IDEA导航特性Top
- 下一篇: RabbitMQ指南(上)