您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中hashCode方法怎么用”,在日常操作中,相信很多人在Java中hashCode方法怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中hashCode方法怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
hashCode()
的作用是獲取哈希碼,也稱為散列碼,它實際上是返回一個int整數(shù)。這個哈希碼的作用是確定該對象在哈希表中的索引位置。
hashCode()
定義在JDK的Object.java中,這就意味著Java中的任何類都包含有 hashCode()
函數(shù)。
散列表存儲的是鍵值對(key-value),它的特點是:能根據(jù)“鍵”快速的檢索出對應的“值”。這其中就利用到了散列碼?。梢钥焖僬业剿枰膶ο螅?/p>
在我們編寫程序的過程中,判斷兩個對象是否相同是十分常見且經(jīng)常面對的一個問題。而 hashCode()
方法就是用來提升比較兩個對象的速度的。
我們就以“HashSet 如何檢查重復”為例子來說明為什么要有 hashCode:
當你把對象加入 HashSet
時,HashSet 會先計算對象的 hashcode
值來判斷對象加入的位置,同時也會與其他已經(jīng)加入的對象的 hashcode
值作比較,如果沒有相符的 hashcode
, HashSet
會假設對象沒有重復出現(xiàn)。
但是如果發(fā)現(xiàn)有相同 hashcode
值的對象,這時會調(diào)用 equals()方法來檢查 hashcode
相等的對象是否真的相同。如果兩者相同, HashSet
就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。
這樣我們就大大減少了 equals
的次數(shù),相應就大大提高了執(zhí)行速度。
Java 對于 eqauls() 方法和 hashCode() 方法是這樣規(guī)定的:
同一對象上多次調(diào)用 hashCode() 方法,總是返回相同的整型值。
如果 a.equals(b),則一定有 a.hashCode() 一定等于 b.hashCode()。
如果 !a.equals(b),則 a.hashCode() 不一定等于 b.hashCode()。此時如果 a.hashCode() 總是不等于 b.hashCode(),會提高 hashtables 的性能。
a.hashCode()==b.hashCode() 則 a.equals(b) 可真可假
a.hashCode()!= b.hashCode() 則 a.equals(b) 為假。
上面結(jié)論簡記:
如果兩個對象 equals,Java 運行時環(huán)境會認為他們的 hashCode 一定相等。
如果兩個對象不 equals,他們的 hashCode 有可能相等。
如果兩個對象 hashCode 相等,他們不一定 equals。
如果兩個對象 hashCode 不相等,他們一定不 equals。
我們上面講解到 如果 兩個對象 equals
的話,那么它們的 hashCode
值必然相等。如果只重寫了 equals
方法,而不重寫 hashCode
的方法,會造成 hashCode
的值不同,而 equals
方法判斷出來的結(jié)果為true
。
在Java中的一些容器中,不允許有兩個完全相同的對象,插入的時候,如果判斷相同則會進行覆蓋。這時候如果只重寫了 equals
的方法,而不重寫 hashCode
的方法,Object中 hashCode
是根據(jù)對象的存儲地址轉(zhuǎn)換而形成的一個哈希值。這時候就有可能因為沒有重寫 hashCode
方法,造成相同的對象散列到不同的位置而造成對象的不能覆蓋的問題。
例如
Dog類
package com.xiao; /** * @author :小肖 * @date :Created in 2022/3/11 14:42 */ public class Dog { private String name; private Integer age; public Dog() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Dog(String name, Integer age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if(obj.getClass() != getClass()){ return false; } Dog dog = (Dog) obj; if(dog.getAge() == age && dog.getName().equals(name)){ return true; } return false; } }
測試類
import com.xiao.Dog; public class Test { public static void main(String[] args) { Dog dog = new Dog("小旺",2); Dog dog1 = new Dog("小旺",2); System.out.println("equals結(jié)果:" + dog.equals(dog1)); System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode())); } }
測試結(jié)果
equals結(jié)果:true
dog 的 hashCode 值是否等于 dog1 的 hashCode 值:false
到此,關于“Java中hashCode方法怎么用”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。