<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Integer包裝類內(nèi)部為什么要實(shí)現(xiàn)Comparable接口?

          共 2908字,需瀏覽 6分鐘

           ·

          2020-09-27 03:12


          今天在開(kāi)發(fā)中無(wú)意看到Integer包裝類內(nèi)部實(shí)現(xiàn)了Comparable接口,因此探查一下該接口作用:



          查看API解釋:


          此接口強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。


          一、為什么需要實(shí)現(xiàn)這個(gè)接口呢?


          首先看一下數(shù)據(jù)的例子:


          String[] strArr = {"A","B","C","E","D"};
          Arrays.sort(strArr);
          for?(String?string?: strArr) {
          ????System.out.print(string+";");
          }


          輸出結(jié)果:


          A;B;C;D;E;


          從中我們可以看出sort方法對(duì)數(shù)據(jù)中的String字符串按照一定規(guī)則進(jìn)行了排序,那為什么會(huì)排序呢?


          查看String類我們可以看到:


          public?final?class?String
          implements?Serializable, Comparable, CharSequence
          ????...


          它也實(shí)現(xiàn)了Comparable接口。里面實(shí)現(xiàn)了compareTo方法,所以按照某種規(guī)則能夠進(jìn)行排序。


          如果數(shù)組中的對(duì)象不是String而是自定義的類型呢?


          public?class?ComparableDemo{
          ????public?static?void?main(String[] args) {
          ????????Object[] objArray = {new?Person(20,"jack"),new?Person(17,"tom"),
          ????????????????????????????new?Person(27,"aj")};
          ????????for?(Object object?: objArray) {
          ??????System.out.print(object.toString());
          ????????}
          ????????Arrays.sort(objArray);
          ????????for?(Object object?: objArray) {
          ????????????System.out.print(object.toString());
          ????????}
          ????
          ????}
          }


          結(jié)果為:


          Person?[age=20, name=jack]Person?[age=17, name=tom]Person?[age=27, name=aj]
          Exception?in?thread?"main" java.lang.ClassCastException: interfacedemo.Person?cannot?be?cast?to?java.lang.Comparable
          ??at?java.util.ComparableTimSort.countRunAndMakeAscending(Unknown?Source)
          ??at?java.util.ComparableTimSort.sort(Unknown?Source)
          ??at?java.util.ComparableTimSort.sort(Unknown?Source)
          ??at?java.util.Arrays.sort(Unknown?Source)
          ??at?interfacedemo.ComparableDemo.main(ComparableDemo.java:18)


          可以看到不進(jìn)行排序打印是正常的,但是排序時(shí)報(bào)錯(cuò)了。因?yàn)橄到y(tǒng)無(wú)法知道使用什么規(guī)則進(jìn)行排序。


          我們存入字符串排序成功是因?yàn)镾tring類已經(jīng)實(shí)現(xiàn)Comparable接口,因此想要實(shí)現(xiàn)自定義對(duì)象比較同樣需要實(shí)現(xiàn)該接口,其中的比較方法規(guī)則由我們自己設(shè)定。


          二、接口簡(jiǎn)介


          實(shí)現(xiàn)此接口的對(duì)象列表(和數(shù)組)可以通過(guò) Collections.sort(和 Arrays.sort)進(jìn)行自動(dòng)排序。實(shí)現(xiàn)此接口的對(duì)象可以用作有序映射中的鍵或有序集合中的元素,無(wú)需指定比較器。


          對(duì)于類 C 的每一個(gè) e1 和 e2 來(lái)說(shuō),當(dāng)且僅當(dāng) e1.compareTo(e2) == 0 與 e1.equals(e2) 具有相同的 boolean 值時(shí),類 C 的自然排序才叫做與 equals 一致。注意,null 不是任何類的實(shí)例,即使 e.equals(null) 返回 false,e.compareTo(null) 也將拋出 NullPointerException。


          建議(雖然不是必需的)最好使自然排序與 equals 一致。這是因?yàn)樵谑褂米匀慌判蚺c equals 不一致的元素(或鍵)時(shí),沒(méi)有顯式比較器的有序集合(和有序映射表)行為表現(xiàn)“怪異”。尤其是,這樣的有序集合(或有序映射表)違背了根據(jù) equals 方法定義的集合(或映射表)的常規(guī)協(xié)定。


          例如,如果將兩個(gè)鍵 a 和 b 添加到?jīng)]有使用顯式比較器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那么第二個(gè) add 操作將返回 false(有序集合的大小沒(méi)有增加),因?yàn)閺挠行蚣系慕嵌葋?lái)看,a 和 b 是相等的。


          實(shí)際上,所有實(shí)現(xiàn) Comparable 的 Java 核心類都具有與 equals 一致的自然排序。java.math.BigDecimal 是個(gè)例外,它的自然排序?qū)⒅迪嗟鹊_度不同的 BigDecimal 對(duì)象(比如 4.0 和 4.00)視為相等。


          從數(shù)學(xué)上講,定義給定類 C 上自然排序的關(guān)系式 如下:


          {(x, y)|x.compareTo(y) <= 0}。


          整體排序的 商 是:


          {(x, y)|x.compareTo(y) == 0}。


          它直接遵循 compareTo 的協(xié)定,商是 C 的 等價(jià)關(guān)系,自然排序是 C 的 整體排序。當(dāng)說(shuō)到類的自然排序 與 equals 一致 時(shí),是指自然排序的商是由類的 equals(Object) 方法定義的等價(jià)關(guān)系。


          {(x, y)|x.equals(y)}。


          此接口是 Java Collections Framework 的成員。


          三、實(shí)現(xiàn)該接口


          上面的例子進(jìn)行修改,這里通過(guò)比較對(duì)象中的age屬性進(jìn)行排序


          public?class?Person?implements?Comparable{
          ??private?Integer age;
          ??private?String name;
          ??public?Person(int?age,String name)?{
          ????this.age = age;
          ????this.name = name;
          ??}
          ??@Override
          ??public?String toString()?{
          ????return?"Person [age="?+ age + ", name="?+ name + "]";
          ??}
          ??//進(jìn)行方法重寫
          ??@Override
          ??public?int?compareTo(Object o)?{
          ????Person p = (Person)o;
          ????return?this.age - p.age;
          ??}
          ??
          }


          結(jié)果打印:


          Person [age=20, name=jack]Person [age=17, name=tom]Person [age=27, name=aj]
          Person [age=17, name=tom]Person [age=20, name=jack]Person [age=27, name=aj]


          最后附上該方法API描述:


          compareToint?compareTo(T o)


          比較此對(duì)象與指定對(duì)象的順序。如果該對(duì)象小于、等于或大于指定對(duì)象,則分別返回負(fù)整數(shù)、零或正整數(shù)。


          實(shí)現(xiàn)類必須確保對(duì)于所有的 x 和 y 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的關(guān)系。(這意味著如果 y.compareTo(x) 拋出一個(gè)異常,則 x.compareTo(y) 也要拋出一個(gè)異常。)


          實(shí)現(xiàn)類還必須確保關(guān)系是可傳遞的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味著 x.compareTo(z)>0。


          最后,實(shí)現(xiàn)者必須確保 x.compareTo(y)==0 意味著對(duì)于所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。強(qiáng)烈推薦 (x.compareTo(y)==0) == (x.equals(y)) 這種做法,但并不是 嚴(yán)格要求這樣做。一般來(lái)說(shuō),任何實(shí)現(xiàn) Comparable 接口和違背此條件的類都應(yīng)該清楚地指出這一事實(shí)。推薦如此闡述:“注意:此類具有與 equals 不一致的自然排序。”


          在前面的描述中,符號(hào) sgn(expression) 指定 signum 數(shù)學(xué)函數(shù),該函數(shù)根據(jù) expression 的值是負(fù)數(shù)、零還是正數(shù),分別返回 -1、0 或 1 中的一個(gè)值。


          參數(shù):


          o - 要比較的對(duì)象。


          返回:


          負(fù)整數(shù)、零或正整數(shù),根據(jù)此對(duì)象是小于、等于還是大于指定對(duì)象。


          拋出:


          ClassCastException - 如果指定對(duì)象的類型不允許它與此對(duì)象進(jìn)行比較。



          原文鏈接:csdn.net/ysj4428/article/details/81195846



          瀏覽 77
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91久久婷婷 | 婷婷丁香在线 | 天天色色天天 | 欧美sese | 91成人精品 |