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

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

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

    Chan Chen Coding...

    hashcode() and equal()

    equal方法 
    Object類的equals方法用于檢測一個對象是否等于另外一個對象,而Object類中這個方法的定義為兩個對象是否具有相同的引用。源碼如下: 
    Java代碼
    public boolean equals(Object obj) {  
        return (this == obj);  
        }  
    看起來沒有什么問題,兩個對象具有相同的引用,那這兩個對象一定是相等的,但在實際應用中,這樣的比較其實并沒有什么實際意義,經常發生的場景就是需要比較兩個對象的狀態的相等性,比如某個對象的唯一性標識一致我們就認為這兩個對象相等。java規范中對equal方法有如下要求 
    自反性:對于任何非空引用x,x,equal(x)應該返回true 
    對稱性:對于任何引用x,x如果x.equal(y)返回true,那么y.equal(x)也應該返回true 
    傳遞性:對于任何x,y,z,如果x.equal(y)返回true,y.equal(z)返回true,那么z.equal(x)返回true也應該返回true。 
    一致性:如果x,y的引用沒有發生變化,那么反復調用equal方法應該返回同樣的結果 
    非空性:對于任意非空引用x,x.equal(null)都應該返回false 
    為了滿足實際需要,這個時候我們就需要重寫equal方法,針對規范,比較典型的寫法如下: 
    Java代碼 
    /** 
         * 
    @author GraMind 
         * 
    @param obj 
         * 
    @return 
         * 
    @exception  
         * 
    @see java.lang.Object#equals(java.lang.Object) 
         
    */  
        @Override  
        public boolean equals(Object obj)  
        {  
            if (this == obj)                                         1  
                return true;  
            if (obj == null)                                         2  
                return false;  
            if (getClass() != obj.getClass())                        3  
                return false;  
            ClassName other = (ClassName) obj;                       4  
            if (id != other.id)                                      5  
                return false;  
            .  
            return true;  
        }  

    對于上面的代碼 
    1)檢測兩者是否引用同一個對象 
    2)檢測object是否為null,如果為null直接返回false 
    3)避免父子類引用相同的域(比如上類父子都具有id屬性),比較是否屬于同一級類,如果每個子類都具有統一的語義也可以使用instanceof來檢測 
    4)轉換要比較的類為對應的類類型變量 
    5)根據需要比較相應的域 
    注意:如果在子類中重寫了equal方法,就要在其中包含super.equal(...)。 
    散列碼 
    散列碼是有對象導出來的一個整形值,且沒有規律。如果重寫equal方法那么就必須重寫hashCode方法 
    想要明白為什么這樣做,你必須要先知道Java中的集合。   
    總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。 
    你知道它們的區別嗎?前者集合內的元素是有序的,元素可以重復;后者元素無序,但元素不可重復。 
    那么這里就有一個比較嚴重的問題了:要想保證元素不重復,可兩個元素是否重復應該依據什么來判斷呢? 
    這就是Object.equals方法了。但是,如果每增加一個元素就檢查一次,那么當元素很多時,后添加到集合中的元素比較的次數就非常多了。 
    也就是說,如果集合中現在已經有1000個元素,那么第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大降低效率。    
    于是,Java采用了哈希表的原理。哈希(Hash)實際上是個人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。 
    哈希算法也稱為散列算法,是將數據依特定算法直接指定到一個地址上。 
    初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能并不是,比如大家可以看下String的hashCode實現)。   
    這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。 
    如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了, 
    就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。 
    所以這里存在一個沖突解決的問題。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。   
    所以,Java對于eqauls方法和hashCode方法是這樣規定的: 
    1、如果兩個對象相同,那么它們的hashCode值一定要相同;2、如果兩個對象的hashCode相同,它們并不一定相同     上面說的對象相同指的是用eqauls方法比較。 

    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2012-11-03 11:00 Chan Chen 閱讀(288) 評論(0)  編輯  收藏 所屬分類: Scala / Java

    主站蜘蛛池模板: 亚洲五月综合缴情婷婷| 大桥未久亚洲无av码在线| 亚洲精品国产成人| 美女视频黄a视频全免费网站色| 最新国产乱人伦偷精品免费网站| 在线观看特色大片免费视频| 久久亚洲国产精品五月天婷| ww亚洲ww在线观看国产| 免费观看无遮挡www的小视频| 国产亚洲?V无码?V男人的天堂| 人禽伦免费交视频播放| 岛国大片免费在线观看| 亚洲综合久久1区2区3区| 91麻豆国产免费观看| 亚洲香蕉网久久综合影视| 国产成人精品日本亚洲语音| 国产精品另类激情久久久免费| 亚洲六月丁香六月婷婷蜜芽| 国产午夜精品免费一区二区三区| 国产免费观看黄AV片| 在线综合亚洲中文精品| 日本xxwwxxww在线视频免费| 亚洲中文字幕日本无线码| 国产男女猛烈无遮挡免费视频 | 免费黄网站在线看| 亚洲经典在线中文字幕| 成**人免费一级毛片| 一区二区三区免费在线视频 | 亚洲ⅴ国产v天堂a无码二区| 精品一区二区三区免费观看| 亚洲国产V高清在线观看| 亚洲av无码片vr一区二区三区 | 亚洲爆乳无码精品AAA片蜜桃| 免费看成人AA片无码视频羞羞网| 亚洲国产精品国自产电影| 日本一区午夜艳熟免费| 亚洲伊人久久大香线蕉在观| 亚洲av无码成人精品区在线播放| 花蝴蝶免费视频在线观看高清版 | 无码人妻AV免费一区二区三区 | 成人黄动漫画免费网站视频|