<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術(shù)分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

    一句話概括:==比較的是兩個對象的引用(即內(nèi)存地址)是否相等,而equals()比較的是兩個對象的值(即內(nèi)存地址里存放的值)是否相等。當然equals()在個別類中被重寫了那就例外了。

    詳細論述:eqauls 與 = =之異同

    1)比較方式角度:

    = =是面向過程的操作符;equals是面向?qū)ο蟮牟僮鞣?/p>

    = =不屬于任何類,equals則是任何類(在Java中)的一個方法;

    我們可以1)Primitive1 (基本類型)= = Primitive2(基本類型);

             2)Object Reference1(對象引用)= = Object Reference2(對象引用)

             3)Object Reference1 (對象引用) .equals(Object Reference2 (對象引用))

               這三種比較

               但卻不能Primitive1 (基本類型).equals( Primitive2(基本類型));

     對于基本類型,沒有面向?qū)ο笾邪l(fā)送消息一說,自然也不會有

    方法成員。

     

    2)比較目的角度:

    1)    如果要比較兩個基本類型是否相等,請用= =;

    2)    如果要比較兩個對象引用是否相等,請用= =;

    3)    如果要比較兩個對象(邏輯上)是否一致,請用equals;

     

    對兩個對象(邏輯上)是否一致的闡釋:

       有人會問:在C++中, 比較兩個對象相等不是也可以用==嗎?我知道您是指運算符重載,但是很遺憾,Java中不支持運算符重載(java中亦有重載過運算符,他們是“+”,“+=”,不過也僅此兩個,而且是內(nèi)置實現(xiàn)的);所以,對象的是否相等的比較這份責任就交由  equals()來實現(xiàn) 。   

    這個“邏輯上”其實就取決于人類的看法,實際開發(fā)中,就取決于用戶的需求;


    第三節(jié):equals()緣起:

            equals()是每個對象與生俱來的方法,因為所有類的最終基類就是Object(除去Object本身);而equals()是Object的方法之一。

            我們不妨觀察一下Object中equals()的source code:

             public boolean equals(Object obj) {

                          return (this == obj);

              }

            注意 “return (this == obj)”

            this與obj都是對象引用,而不是對象本身。所以equals()的缺省實現(xiàn)就是比較

            對象引用是否一致;為何要如此實現(xiàn)呢? 前面我們說過:對象是否相等,是由我們的需求決定的,世界上的類千奇百怪(當然,這些類都是我們根據(jù)模擬現(xiàn)實世界而創(chuàng)造的),雖然Object是他們共同的祖先,可他又怎能知道他的子孫類比較相等的標準呢?但是他明白,任何一個對象,自己總是等于自己的,何謂“自己總是等于自己”呢,又如何判斷“自己總是等于自己”呢?一個對象在內(nèi)存中只有一份,但他的引用卻可以有無窮多個,“對象自己的引用1=對象自己的引用2”,不就能判斷“自己總是等于自己”嗎?所以缺省實現(xiàn)實現(xiàn)自然也就是

            “return (this == obj)”;

            而到了我們自己編寫的類,對象相等的標準由我們確立,于是就不可避免的要覆寫

            繼承而來的public boolean equals(Object obj);

            如果您有過編覆寫過equals()的經(jīng)驗(沒有過也不要緊),請您思考一個問題:

             “兩個對象(邏輯上)是否一致”實際上是比較什么?沒錯,或許您已脫口而出:

           就是對象的屬性(即field,或稱數(shù)據(jù)成員)的比較。方法是不可比較的哦。(這個問題是不是有些弱智呢?哈哈)

     第四節(jié):對一個推論的思考

    推論如下:一言以蔽之:欲比較棧中數(shù)據(jù)是否相等,請用= =;

                          欲比較堆中數(shù)據(jù)是否相等,請用equals;

    因為(根)基本類型,(根)對象引用都在棧中; 而對象本身在堆中;

             這句話又對又不對,問題出在哪,就是“數(shù)據(jù)”二字,先看棧中,數(shù)據(jù)或為基本類型,或為對象引用,用==比較當然沒錯;但是堆中呢?對象不是堆中嗎?不是應(yīng)該用equals比較嗎?可是,我們比較的是堆中“數(shù)據(jù)”,堆中有對象,對象由什么構(gòu)成呢?可能是對象引用,可能是基本類型,或兩者兼而有之。如果我們要比較他們,該用什么呢,用”equals()”?不對吧,只能是”= =”!所以正確的結(jié)論是:欲比較棧中數(shù)據(jù)是否相等,請用= =; 欲比較堆中數(shù)據(jù)是否相等,請用equals;

    因為(根)基本類型,(根)對象引用都在棧中(所謂“根”,指未被任何其他對象所包含); 而對象本身在堆中。

    文章出處:DIY部落(http://www.diybl.com/course/3_program/java/javajs/2007917/71587.html#)

    posted on 2010-03-05 10:36 小菜毛毛 閱讀(217) 評論(0)  編輯  收藏 所屬分類: 面試
    主站蜘蛛池模板: 亚洲最大免费视频网| 亚洲日韩在线第一页| 日本精品久久久久久久久免费| 亚洲男人天堂2020| 十八禁无码免费网站| 久久亚洲精品国产精品婷婷 | 亚洲国产婷婷综合在线精品| 在线观看免费视频网站色| 亚洲激情视频网站| 亚洲成av人片天堂网老年人| 99在线免费观看视频| 成人婷婷网色偷偷亚洲男人的天堂 | 亚洲欧洲日产国码久在线观看 | 亚洲一级毛片免费在线观看| 又爽又高潮的BB视频免费看| 91视频免费网址| 一区二区免费在线观看| 亚洲国产精品成人精品软件| 国产亚洲精品不卡在线| 一个人免费观看www视频在线| 你是我的城池营垒免费观看完整版| 亚洲中文无码亚洲人成影院| 亚洲日韩一页精品发布| 日本高清免费不卡视频| 91精品国产免费入口| 一区在线免费观看| 亚洲成熟丰满熟妇高潮XXXXX| 亚洲酒色1314狠狠做| 成人午夜亚洲精品无码网站| 四虎免费大片aⅴ入口| 在线免费观看国产| a在线视频免费观看| 特级毛片aaaa级毛片免费| 亚洲精品人成网在线播放影院| 亚洲AV无码1区2区久久| 亚洲精品无码久久毛片| 在线免费观看国产视频| 美女视频黄免费亚洲| 99热在线观看免费| 免费视频精品一区二区三区| 一级日本高清视频免费观看|