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

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

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

    posts - 28,  comments - 15,  trackbacks - 0
        使用java的人都知道,如果覆蓋了Object的equals方法,那么必須要覆蓋hashCode方法,并且如果兩個對象用equals方法比較返回true,那么這兩個對象hashCode返回的值也必須是相等的,并且對于同一個對象,equals方法需要比較的屬性值沒有被修改,那么每次調用hashCode返回的值應該是一致的。
        那么為什么需要這樣呢,是不是所有的對象在覆蓋Object的equal方法時都需要覆蓋hashCode方法呢?下面以一個實例來說明該問題:
     public class HashTest
    {
        @Test
        
    public void testEqualAndHash()
        
    {
            
            Map
    <HashObject, String> map = new HashMap<HashObject, String>();
            
    for(int i = 0; i < 10; i++)
            
    {
                HashObject o 
    = new HashObject();
                o.setId(i);
                o.setIdCard(
    "id_" + i);
                o.setName(
    "name_" + i);
                o.setAddress(
    "address_" + i);
                
                map.put(o, o.getName());
                System.out.println();
            }

            
            HashObject o 
    = new HashObject();
            o.setId(
    0);
            o.setIdCard(
    "id_" + 0);
            o.setName(
    "name_" + "zhangsan");
            String v 
    = map.put(o, o.getName());
            
    /* 未實現hashcode方法,調用map的put方法將不會返回舊值,而是返回null */
            System.out.println(
    "v:" + v);
            System.out.println(
    "size:" + map.size());
        }

    }


    public class HashObject
    {
        
    private Integer id;
        
        
    private String name;
        
        
    private String idCard;
        
        
    private String address;
        
        
    public Integer getId()
        
    {
            
    return id;
        }

        
        
    public void setId(Integer id)
        
    {
            
    this.id = id;
        }

        
        
    public String getName()
        
    {
            
    return name;
        }

        
        
    public void setName(String name)
        
    {
            
    this.name = name;
        }

        
        
    public String getIdCard()
        
    {
            
    return idCard;
        }

        
        
    public void setIdCard(String idCard)
        
    {
            
    this.idCard = idCard;
        }

        
        
    public String getAddress()
        
    {
            
    return address;
        }

        
        Object o 
    = null;
        
        
    public void setAddress(String address)
        
    {
            
    this.address = address;
        }

        
        
    public boolean equals(Object o)
        
    {
            
            
    if(this == o)
                
    return true;
            
            HashObject x 
    = (HashObject) o;
            
    if(x.getIdCard().equals(this.idCard))
                
    return true;
            
     
           return false;
            
        }

        
        
    // public int hashCode()
        
    // {
        
    //
        
    // return 17 * 37 + this.idCard.hashCode();
        
    //
        
    // }
    }

    關閉與開啟HashObject的hashCode方法的執行結果
    v:null
    size:11
    ----------------------
    v:name_0
    size:10

    那么為什么會這樣呢,讓我們看看
     1public V put(K key, V value) {
     2        if (key == null)
     3            return putForNullKey(value);
     4        /*對key的hashcode做hash運算*/
     5        int hash = hash(key.hashCode());
     6        /*獲得key對應的Entry的索引位置*/
     7        int i = indexFor(hash, table.length);
     8        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
     9            Object k;
    10            /*HashMap采用鏈表來解決hashcode沖突,從這里可以看出,只有hashcode相等,且equals或者地址相等,HashMap才認為對象是相同的*/
    11            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
    12                V oldValue = e.value;
    13                e.value = value;
    14                e.recordAccess(this);
    15                return oldValue;
    16            }

    17        }

    18
    19        modCount++;
    20        addEntry(hash, key, value, i);
    21        return null;
    22    }
    HashMap的實現就一目了然了。HashMap采用Entry數組作為存儲<key,value>的數據結構,數組的索引是同過對key的hashcode做hash運算獲得的,HashMap采用鏈表來解決hash沖突問題。下面讓我們看看HashMap的put方法實現:


    posted on 2012-08-16 18:39 zhangxl 閱讀(424) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2012年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用鏈接

    留言簿(1)

    隨筆分類(17)

    隨筆檔案(28)

    文章分類(30)

    文章檔案(30)

    相冊

    收藏夾(2)

    hibernate

    java基礎

    mysql

    xml

    關注

    壓力測試

    算法

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 96306
    • 排名 - 601

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 99精品国产免费久久久久久下载| 日本人的色道www免费一区| 亚洲色图黄色小说| 老司机永久免费网站在线观看| 免费国产黄网站在线看| 亚洲成a人片77777老司机| 好爽又高潮了毛片免费下载| 一级毛片a免费播放王色| 色播亚洲视频在线观看| mm1313亚洲精品无码又大又粗| 国产免费一区二区视频| 亚洲国产欧美日韩精品一区二区三区| 亚洲人成网站色在线入口| 最近中文字幕完整版免费高清| 美女羞羞视频免费网站| 亚洲欧洲视频在线观看| 亚洲高清无码专区视频| 久久午夜免费视频| 久久久久久久久久免免费精品| 激情五月亚洲色图| 亚洲AV无码久久精品狠狠爱浪潮| 日本不卡在线观看免费v| 久久久久久久99精品免费| 美女黄频视频大全免费的| 亚洲精彩视频在线观看| 亚洲一级片内射网站在线观看| 男人的好免费观看在线视频| 久久久国产精品福利免费| 老司机福利在线免费观看| 亚洲专区一路线二| 亚洲AV中文无码字幕色三| 亚洲AV伊人久久青青草原| 两性刺激生活片免费视频| 日韩免费人妻AV无码专区蜜桃| 午夜成人无码福利免费视频| 亚洲一线产区二线产区区| 亚洲男人电影天堂| 亚洲AV无码AV男人的天堂| 国产精品亚洲高清一区二区 | 美女视频黄a视频全免费| 18禁在线无遮挡免费观看网站|