hashCode和equals方法

很早就對hashCode和equals方法有疑問了,一直留着沒去解決,今天正好想起,所以百度了,但我確實是通過自己的話寫的,所以姑且算是原創吧。


HashSet或者HashMap裏的值是不能重複的。那麼我們來假設,裏面已經存放了1000個值了,

下面我要存第1001個值,我怎麼判斷這1001個值是不是跟前面1000個值是否相等呢?


這時有人會說用equals()方法,是的,可以,但是你要與1000個值都equals一下,那不是很慢嘛?,1000還好,那要是10000呢,100000呢,這就吃不消了。


所以要用到hashCode,就把hashCode當做一個地址值。當你存入數據時,直接找到你hashCode所對應的物理內存,看你裏面是不是已經存放一個值了,沒存放就直接存放,存放了就調用一下equals方法,如果相等,則丟掉,不等,則與其形成散列筒,一起存放了。


所以,當你創建一個類的時候,你要重寫equals方法的時候,你最好也重寫hashCode,不然你創了2個屬性啊 方法啊都相等的對象,都能插入HashSet或者HashMap,這就可能和你原來的意願違背了。


還有一點就是hashCode和equals的判斷標準應該是一樣的,比如,你equals是利用了對象裏的2個屬性是否相等來判斷這個對象是不是相等的,那麼你hashCode方法裏返回的值也要跟這2個屬性有關。

因爲你hashCode就是爲了不讓equals判斷那麼多次而存在的嘛(可能還有其他更深入的作用)

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