<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 閱讀(423) 評論(0)  編輯  收藏

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


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

    常用鏈接

    留言簿(1)

    隨筆分類(17)

    隨筆檔案(28)

    文章分類(30)

    文章檔案(30)

    相冊

    收藏夾(2)

    hibernate

    java基礎

    mysql

    xml

    關注

    壓力測試

    算法

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 96260
    • 排名 - 601

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲性无码一区二区三区| 亚洲精品无码成人片在线观看 | 亚洲AV男人的天堂在线观看| 久久精品国产亚洲AV无码娇色| 亚洲阿v天堂在线| 亚洲va国产va天堂va久久| 亚洲高清专区日韩精品| 久久久久久久久亚洲| 亚洲综合无码一区二区| 亚洲精品国产电影午夜| 亚洲AV综合色区无码二区偷拍| 在线综合亚洲中文精品| 亚洲色偷偷综合亚洲av78 | 亚洲国产成人手机在线电影bd | 香蕉蕉亚亚洲aav综合| 亚洲第一精品在线视频| 亚洲性一级理论片在线观看| 亚洲免费黄色网址| 亚洲av无码专区在线观看下载| 看亚洲a级一级毛片| ssswww日本免费网站片| 野花香高清在线观看视频播放免费| 秋霞人成在线观看免费视频| 2015日韩永久免费视频播放| 国产一精品一AV一免费孕妇| 国产乱子伦片免费观看中字| 国产亚洲av片在线观看18女人 | 国产精品冒白浆免费视频| 亚洲精品成人在线| 亚洲AV乱码一区二区三区林ゆな| 亚洲自偷精品视频自拍| 亚洲日韩一区精品射精| 永久免费无码网站在线观看个| baoyu777永久免费视频| 99久久99这里只有免费费精品| 国内精品免费视频自在线| 亚洲一级特黄无码片| 亚洲国产日韩一区高清在线| 亚洲中文字幕无码一去台湾 | 亚洲欧美中文日韩视频| 国产精品内射视频免费|