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

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

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

    zhyiwww
    用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
    posts - 536,comments - 394,trackbacks - 0
    hashcode,一個(gè)不太好理解,也常被我們忽視的一個(gè)概念。然而,hashcode還有對(duì)我們有用的東西。
    java給我們提供了兩種判斷對(duì)象對(duì)等的方式。如果我們判斷兩個(gè)對(duì)象是否相等,那么直接用“==”運(yùn)算就可以了。然而,判斷兩個(gè)對(duì)象對(duì)等,就沒有那么簡(jiǎn)單了。
    在java中,我們常常通過equals()方法來判斷兩個(gè)對(duì)象的對(duì)等。其實(shí),我么還可以通過hashCode()來判斷兩個(gè)對(duì)象的對(duì)等。

    看下面的例子:

    import java.util.List;

    public class MyBag{
    ??? float money;
    ??? List books;??
    }
    我們?nèi)绾闻袛鄡蓚€(gè)MyBag對(duì)象是對(duì)等的呢?也就是說,如果有兩個(gè)MyBag的對(duì)象bag1和bag2,通過什么的辦法能說明這個(gè)兩個(gè)對(duì)象是相同的呢?
    先聲名兩個(gè)概念:
    兩個(gè)對(duì)象相等,指的是,兩個(gè)引用指向了同一個(gè)對(duì)象,也就是說,指向了內(nèi)存中的同一個(gè)地址。
    兩個(gè)對(duì)象相同(對(duì)等),指得是兩個(gè)對(duì)象的任何屬性都相等,但是,不是一個(gè)對(duì)象。

    所以,對(duì)于上面的MyBag的對(duì)象對(duì)等,那么,兩個(gè)對(duì)象的money要一樣,同時(shí),books要對(duì)等。那么如何去判斷呢?我們通常會(huì)自己去實(shí)現(xiàn)equals()方法去判斷,方法如下:

    ??? public boolean equals(Object obj) {
    ??? ??? if (this == obj)
    ??? ??? ??? return true;
    ??? ??? if (obj == null)
    ??? ??? ??? return false;
    ??? ??? if (getClass() != obj.getClass())
    ??? ??? ??? return false;
    ??? ??? final MyBag other = (MyBag) obj;
    ??? ??? if (books == null) {
    ??? ??? ??? if (other.books != null)
    ??? ??? ??? ??? return false;
    ??? ??? } else if (!books.equals(other.books))
    ??? ??? ??? return false;
    ??? ??? if (Float.floatToIntBits(money) != Float.floatToIntBits(other.money))
    ??? ??? ??? return false;
    ??? ??? return true;
    ??? }

    我們也可以通過實(shí)現(xiàn)hashCode()來實(shí)現(xiàn):
    ??? public int hashCode() {
    ??? ??? final int prime = 31;
    ??? ??? int result = 1;
    ??? ??? result = prime * result + ((books == null) ? 0 : books.hashCode());
    ??? ??? result = prime * result + Float.floatToIntBits(money);
    ??? ??? return result;
    ??? }

    那么我們判斷兩個(gè)對(duì)象對(duì)等時(shí),就可以這樣來實(shí)現(xiàn)了:
    if(bag1.equals(bag2)){
    ??? // 對(duì)等
    }

    或者
    if(bag1.haseCode()==bag2.hashCode()){
    ??? // 對(duì)等
    }

    為什么這種方式也能判斷兩個(gè)對(duì)象對(duì)等呢?
    因?yàn)椋魏我粋€(gè)對(duì)象的hashCode是唯一的,并且和氣對(duì)象屬性按照一定的規(guī)則相關(guān)的。

    比如,一個(gè)Integer的hashCode值就是其整數(shù)值,因?yàn)镮nteger的haseCode()是這樣實(shí)現(xiàn)的:
    ??? public int hashCode() {
    ??? ??? return value;
    ??? }
    ??? public boolean equals(Object obj) {
    ??? ??? if (obj instanceof Integer)
    ??? ??? ??? return value == ((Integer) obj).intValue();
    ??? ??? else
    ??? ??? ??? return false;
    ??? }

    由此可以看到,也對(duì)象的HashCode是和其屬性有一定的聯(lián)系,規(guī)則和屬性的值有一定的聯(lián)系,這個(gè)規(guī)則決定了有相同的hashcode,就有兩個(gè)對(duì)象的屬性對(duì)等。



    |----------------------------------------------------------------------------------------|
                               版權(quán)聲明  版權(quán)所有 @zhyiwww
                引用請(qǐng)注明來源 http://m.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2008-04-22 18:03 zhyiwww 閱讀(1389) 評(píng)論(1)  編輯  收藏 所屬分類: java basic

    FeedBack:
    # re: 對(duì)hashCode的一點(diǎn)簡(jiǎn)單認(rèn)識(shí)
    2008-04-23 16:48 | 懶人
    那hashtable是什么用的?  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 久久精品国产亚洲综合色 | a毛片免费在线观看| 国产成人免费ā片在线观看| 中文日韩亚洲欧美制服| 野花高清在线电影观看免费视频| 亚洲国产精品成人久久久| 精品香蕉在线观看免费| 亚洲一级视频在线观看| 日韩精品福利片午夜免费观着| 国产99在线|亚洲| 免费被黄网站在观看| 美女视频黄频a免费| 亚洲午夜福利精品无码| 三上悠亚电影全集免费| 午夜亚洲www湿好大| 亚洲日本一区二区三区在线不卡| 大桥未久亚洲无av码在线| 亚洲国产成人精品女人久久久| 亚洲黄片手机免费观看| 亚洲AV无码乱码在线观看富二代| 免费一区二区三区| 亚洲短视频在线观看| 国产在线国偷精品产拍免费| 豆国产96在线|亚洲| 亚洲精品午夜国产VA久久成人 | 日产国产精品亚洲系列| 亚洲无人区视频大全| 亚洲人成电影网站免费| 国产亚洲视频在线观看网址| 中文字幕亚洲无线码| 亚洲毛片免费观看| 亚洲国产aⅴ成人精品无吗| 亚洲高清最新av网站| 久操视频在线免费观看| 亚洲一区二区三区在线网站| 免费中文字幕不卡视频| a级毛片在线免费看| 亚洲日韩精品无码专区加勒比 | 51午夜精品免费视频| 久久精品a亚洲国产v高清不卡| 久久国产免费直播|