Item 12: Consider implementing Comparable

才學(xué)了11條摊崭,我已經(jīng)感覺自己的Java基礎(chǔ)提升了一大截..
這一條是說「考慮實(shí)現(xiàn)Comparable接口」。
先了解一下Comparable接口杰赛。


首先是API呢簸,我粗略的翻譯:

這個(gè)接口對(duì)實(shí)現(xiàn)它的Object強(qiáng)加了一個(gè)total ordering(完全排序).這個(gè)ordering是class的natural ordering, class的 compareTo方法是natural comparison method

由Objects組成的Lists(and arrays)可以通過 Collections.sort (and Arrays.sort) 來自動(dòng)排序乏屯。實(shí)現(xiàn)這個(gè)方法的Objects可以被用作sorted map中的keys根时,或者sorted set中的elements(不需要指定comparator)。

natural ordering的意思是辰晕,be consistent with equals.
for every e1 and e2 of class C,
e1.compareTo(e2) == 0 has the same boolean value as e1.equals(e2).
當(dāng)然,null不屬于Object蛤迎,e.compareTo(null)會(huì)拋出NullPointerException。

強(qiáng)烈建議(雖然不是必須)natural ordering 和 equals滿足一致性含友。因?yàn)閟orted sets和sorted maps在沒有explicit的comparators的時(shí)候替裆,當(dāng)他們?cè)诤筒粷M足一致性的elements或keys一起使用的時(shí)候會(huì)表現(xiàn)得 "strangely".

比如,如果加入兩個(gè)key窘问,a和b(such that (!a.equals(b) && a.compareTo(b) == 0) )到一個(gè)不實(shí)用explicit comparator的sorted set里辆童,第二個(gè)add operation 會(huì)返回false(set的大小也不會(huì)增加)因?yàn)樗麄儗?duì)于sorted set's來說是equivalent的(*筆者注:可以想像是因?yàn)閔ashmap這樣的map/set是把key的hash存在hash buckets里面的,這就說明對(duì)于set來說南缓,a和b的key一致胸遇,hash也一致。如果a,b的key不一致汉形,hash一致纸镊,就會(huì)出現(xiàn)hash碰撞,然后就用到?jīng)_突解決算法比如拉鏈法)概疆。

Virtually所有實(shí)現(xiàn)Comparable的Java核心類都有natural ordering that are consistent with equals逗威。


1、比較者大于被比較者(也就是compareTo方法里面的對(duì)象)岔冀,那么返回正整數(shù)

2凯旭、比較者等于被比較者,那么返回0

3使套、比較者小于被比較者罐呼,那么返回負(fù)整數(shù)

一個(gè)例子,可以看到排序的依據(jù)是自己定義的:

public class Field implements Comparable<Field> {

    private String name;
    private int age;

    public Field() {
    }
    public Field(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Field o) {
        // 先按age排序
        if (this.age > o.getAge()) {
            return (this.age - o.getAge());
        }
        if (this.age < o.getAge()) {
            return (this.age - o.getAge());
        }
        // 按name排序
        if (this.name.compareTo(o.getName()) > 0) {
            return 1;
        }
        if (this.name.compareTo(o.getName()) < 0) {
            return -1;
        }
        return 0;
    }
}

然后就可以用放到Collections里面用它的sort來排序了侦高,這個(gè)sort會(huì)調(diào)用compareTo

public class Test {
    public static void main(String[] args) {

        Field f1 = new Field("tony", 11);
        Field f2 = new Field("jack", 11);
        Field f3 = new Field("tom", 11);
        Field f4 = new Field("jason", 44);

        List<Field> list = new ArrayList<Field>();
        list.add(f1);
        list.add(f3);
        list.add(f4);
        list.add(f2);
        Collections.sort(list);

        for (Field o : list) {
            System.out.println(o.getAge() + "-->" + o.getName());
        }
    }
}

和Comparator的區(qū)別

(這是一個(gè)常見的Java面試題..)
Java的Comparator和Comparable當(dāng)需要排序的集合或數(shù)組不是單純的數(shù)字型時(shí)嫉柴,通常可以使用Comparator或Comparable奉呛,以簡(jiǎn)單的方式實(shí)現(xiàn)對(duì)象排序或自定義排序计螺。

區(qū)別的話夯尽,我能看到的就是comparator是java.util里面的,說明它是一個(gè)util登馒;而comparable是java.lang里的,跟Object一個(gè)級(jí)別匙握,是一個(gè)基礎(chǔ)類。還有就是comparator支持升序降序等等更多功能陈轿。其他我不了解了圈纺,作為一個(gè)android出家的程序員也沒遇到過。麦射。

以上赠堵。

EJ里提到的

CONVENTIONS.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呐萨,隨后出現(xiàn)的幾起案子杀饵,更是在濱河造成了極大的恐慌,老刑警劉巖谬擦,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件切距,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惨远,警方通過查閱死者的電腦和手機(jī)谜悟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來北秽,“玉大人葡幸,你說我怎么就攤上這事『孛ィ” “怎么了蔚叨?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)辙培。 經(jīng)常有香客問我蔑水,道長(zhǎng),這世上最難降的妖魔是什么扬蕊? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任搀别,我火速辦了婚禮,結(jié)果婚禮上厨相,老公的妹妹穿的比我還像新娘领曼。我一直安慰自己鸥鹉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布庶骄。 她就那樣靜靜地躺著毁渗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪单刁。 梳的紋絲不亂的頭發(fā)上灸异,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音羔飞,去河邊找鬼肺樟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛逻淌,可吹牛的內(nèi)容都是我干的么伯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卡儒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼田柔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骨望,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硬爆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后擎鸠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缀磕,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年劣光,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袜蚕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绢涡,死狀恐怖廷没,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垂寥,我是刑警寧澤颠黎,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站滞项,受9級(jí)特大地震影響狭归,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜文判,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一过椎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戏仓,春花似錦疚宇、人聲如沸亡鼠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)间涵。三九已至,卻和暖如春榜揖,著一層夾襖步出監(jiān)牢的瞬間勾哩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工举哟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留思劳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓妨猩,卻偏偏與公主長(zhǎng)得像潜叛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壶硅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容