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

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

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

    thinking

    one platform thousands thinking

    關(guān)于hashcode()

    1.hashcode是用來(lái)查找的,如果你學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)就應(yīng)該知道,在查找和排序這一章有
    例如內(nèi)存中有這樣的位置
    0     1     2     3     4     5     6     7    
    而我有個(gè)類(lèi),這個(gè)類(lèi)有個(gè)字段叫ID,我要把這個(gè)類(lèi)存放在以上8個(gè)位置之一,如果不用hashcode而任意存放,那么當(dāng)查找時(shí)就需要到這八個(gè)位置里挨個(gè)去找,或者用二分法一類(lèi)的算法。
    但如果用hashcode那就會(huì)使效率提高很多。
    我們這個(gè)類(lèi)中有個(gè)字段叫ID,那么我們就定義我們的hashcode為ID%8,然后把我們的類(lèi)存放在取得得余數(shù)那個(gè)位置。比如我們的ID為9,9除8的 余數(shù)為1,那么我們就把該類(lèi)存在1這個(gè)位置,如果ID是13,求得的余數(shù)是5,那么我們就把該類(lèi)放在5這個(gè)位置。這樣,以后在查找該類(lèi)時(shí)就可以通過(guò)ID除 8求余數(shù)直接找到存放的位置了。

    2.但是如果兩個(gè)類(lèi)有相同的hashcode怎么辦那(我們假設(shè)上面的類(lèi)的ID不是唯一的),例如9除以8和17除以8的余數(shù)都是1,那么這是不是合法的,回答是:可以這樣。那么如何判斷呢?在這個(gè)時(shí)候就需要定義   equals了。
    也就是說(shuō),我們先通過(guò)   hashcode來(lái)判斷兩個(gè)類(lèi)是否存放某個(gè)桶里,但這個(gè)桶里可能有很多類(lèi),那么我們就需要再通過(guò)   equals   來(lái)在這個(gè)桶里找到我們要的類(lèi)。
    那么。重寫(xiě)了equals(),為什么還要重寫(xiě)hashCode()呢?
    想想,你要在一個(gè)桶里找東西,你必須先要找到這個(gè)桶啊,你不通過(guò)重寫(xiě)hashcode()來(lái)找到桶,光重寫(xiě)equals()有什么用啊

    hashCode()是用來(lái)產(chǎn)生哈希瑪?shù)模,斒怯脕?lái)在散列存儲(chǔ)結(jié)構(gòu)中確定對(duì)象的存儲(chǔ)地址的,(這一段在 Java編程思想 中講的很清楚的)象util包中的 帶 hash 的集合類(lèi)都是用這種存儲(chǔ)結(jié)構(gòu) :HashMap,HashSet, 他們?cè)趯?duì)象存儲(chǔ)時(shí)(嚴(yán)格說(shuō)是對(duì)象引用),需要確定他們的地址吧, 而HashCode()就是這個(gè)用途的,一般都需要重新定義它的,因?yàn)槟J(rèn)情況下,由 Object 類(lèi)定義的 hashCode 方法會(huì)針對(duì)不同的對(duì)象返回不同的整數(shù),這一般是通過(guò)將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來(lái)實(shí)現(xiàn)的,現(xiàn)在舉個(gè)例子來(lái)說(shuō), 就拿HashSet來(lái)說(shuō) ,在將對(duì)象存入其中時(shí),通過(guò)被存入對(duì)象的 hashCode() 來(lái)確定對(duì)象在 HashSet 中的存儲(chǔ)地址,通過(guò)equals()來(lái)確定存入的對(duì)象是否重復(fù),hashCode() ,equals()都需要自己重新定義,因?yàn)閔ashCode()默認(rèn)前面已經(jīng)說(shuō)啦,而equals() 默認(rèn)是比較的對(duì)象引用,你現(xiàn)在想一下,如果你不定義equals()的話,那么同一個(gè)類(lèi)產(chǎn)生的兩個(gè)內(nèi)容完全相同的對(duì)象都可以存入Set,因?yàn)樗麄兪峭ㄟ^(guò) equals()來(lái)確定的,這樣就使得HashSet 失去了他的意義,看一下下面這個(gè):
    import java.util.*;
    /**
    *類(lèi)說(shuō)明
    * @author shellfeng E-mail:lsf830804@yahoo.com.cn
    * @version 1.0
    *
    */
    public class Test {
    public static void main(String[] args) {
    HashSet set = new HashSet();
    for (int i = 0; i <= 3; i++){
    set.add(new Demo1(i,i));
    }
    System.out.println(set);
    set.add(new Demo1(1,1));
    System.out.println(set);
    System.out.println(set.contains(new Demo1(0,0)));
    System.out.println(set.add(new Demo1(1,1)));
    System.out.println(set.add(new Demo1(4,4)));
    System.out.println(set);
    }

    private static class Demo1 {
    private int value;

    private int id;

    public Demo1(int value,int id) {
    this.value = value;
    this.id=id;
    }

    public String toString() {
    return " value = " + value;
    }

    public boolean equals(Object o) {
    Demo1 a = (Demo1) o;
    return (a.value == value) ? true : false;
    }

    public int hashCode() {
    return id;
    }
    }
    }
    你分別注釋掉hashCode()和 equals()來(lái)比較一下他們作用就可以拉,關(guān)鍵要自己動(dòng)手看看比較的結(jié)果你就可以記得很清楚啦
    結(jié)果:
    [ value = 2,  value = 1,  value = 3,  value = 0]
    [ value = 2,  value = 1,  value = 3,  value = 0]
    true
    false
    true
    [ value = 2,  value = 4,  value = 1,  value = 3,  value = 0]

    注釋掉hashCode()
    [ value = 1,  value = 0,  value = 2,  value = 3]
    [ value = 1,  value = 0,  value = 1,  value = 2,  value = 3]
    false
    true
    true
    [ value = 1,  value = 0,  value = 1,  value = 2,  value = 3,  value = 4,  value = 1]

    注釋掉equals()
    [ value = 2,  value = 1,  value = 3,  value = 0]
    [ value = 2,  value = 1,  value = 1,  value = 3,  value = 0]
    false
    true
    true
    [ value = 2,  value = 4,  value = 1,  value = 1,  value = 1,  value = 3,  value = 0]

    hashCode()方法使用來(lái)提高M(jìn)ap里面的搜索效率的,Map會(huì)根據(jù)不同的hashCode()來(lái)放在不同的桶里面,Map在搜索一個(gè)對(duì)象的時(shí)候先 通過(guò)hashCode()找到相應(yīng)的桶,然后再根據(jù)equals()方法找到相應(yīng)的對(duì)象.要正確的實(shí)現(xiàn)Map里面查找元素必須滿足一下兩個(gè)條件:
    (1)當(dāng)obj1.equals(obj2)為true時(shí)obj1.hashCode() == obj2.hashCode()必須為true
    (2)當(dāng)obj1.hashCode() == obj2.hashCode()為false時(shí)obj.equals(obj2)必須為false


    posted on 2009-02-16 10:54 lau 閱讀(557) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 91免费在线播放| 久久久无码精品亚洲日韩蜜臀浪潮| 精品国产污污免费网站aⅴ | a级黄色毛片免费播放视频| 亚洲综合精品成人| 黄色网址免费在线观看| 亚洲乱亚洲乱妇24p| 亚洲综合色一区二区三区小说| 免费无码肉片在线观看| 日韩精品无码免费一区二区三区| 亚洲人成电影网站| 免费观看亚洲人成网站| 国产亚洲免费的视频看| 免费人人潮人人爽一区二区| 久久影院亚洲一区| 国产成人精品免费直播| 女人18毛片a级毛片免费视频| 久久www免费人成看片| 最近免费视频中文字幕大全| 亚洲AV无码精品国产成人| 亚洲一区中文字幕在线观看| 亚洲成人福利在线观看| 亚洲尹人九九大色香蕉网站 | 五月天婷婷精品免费视频| 婷婷亚洲久悠悠色悠在线播放| 久久久久亚洲AV无码专区桃色| 国产乱色精品成人免费视频| 精品少妇人妻AV免费久久洗澡| 曰批全过程免费视频在线观看 | 亚洲制服在线观看| 亚洲国产综合自在线另类| 18gay台湾男同亚洲男同| 国产99视频精品免费视频7| 色吊丝永久在线观看最新免费| 免费的涩涩视频在线播放| 精品国产一区二区三区免费看| 午夜一级毛片免费视频| 国产精品无码素人福利免费| 免费v片视频在线观看视频| 亚洲高清免费视频| 无码人妻精品中文字幕免费东京热|