關於hashCode、equals、Hashtable

    (1)Hashtable是java語言實現哈希表的特性的一個類,充分實現了哈希表查詢效率高的優點。底層編碼不知道,只知道設計的很優秀,使用時可以直接Hashtable實例.put(key,value),此外還有多種方法。詳見http://www.zhuoda.org/Jason/21164.html

    (2)equals()和hashcode()這兩個方法都是從object類中繼承過來的。equals()在Object類中的定義是

    public boolean equals(Object obj)

  {
        return (this == obj); //==永遠是比較兩個對象的地址值
  }

    但是我們必需清楚,當String 、Math、還有Integer、Double等這些封裝類在使用equals()方法時,已經覆蓋了object類的equals()方法,也就是說是進行內容的比較。

    (3)hashcode() 方法,在object類中定義如下:
    public native int hashCode(); <完>
    說明是一個本地方法,它的實現是根據本地機器相關的。當然我們可以在自己寫的類中覆蓋hashcode()方法,比如String、Integer、 Double等等這些類都是覆蓋了hashcode()方法的。

    也就是說,hashcode()是用來得到實例的哈希碼值,equals()是用來判斷兩個對象內容是否相同或者是否就是同一個對象。

    比如java的集合類Set中不允許有重複的元素,如果集合中現在已經有1000個元素,那麼第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大降低效率。當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。

    所以,Java對於eqauls方法和hashCode方法是這樣規定的:1、如果兩個對象相同,那麼它們的hashCode值一定要相同;2、如果兩個對象的hashCode相同,它們並不一定相同     上面說的對象相同指的是用eqauls方法比較,即內容相同。

引用自http://edu.codepub.com/2009/1005/16144_2.php

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章