equal、hashcode、==
1、==
java中的數據類型,可分為兩類:
1.基本數據類型,也稱原始數據類型
byte,short,char,int,long,float,double,boolean ? 他們之間
?
的比較,應用雙等號(==),比較的是他們的值。?
2.引用類型(類、接口、數組) ??
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果為false。
對象是放在堆中的,棧中存放的是對象的引用(地址)。由此可見'=='是對棧中的值進行比較的。如果要比較堆中對象的內容是否相同,那么就要重寫equals方法了。
2、equals
1、默認情況(沒有覆蓋equals方法)下equals方法都是調用Object類的equals方法,而Object的equals方法主要用于判斷對象的內存地址引用是不是同一個地址(是不是同一個對象)。定義的equals與==是等效的
2.要是類中覆蓋了equals方法,那么就要根據具體的代碼來確定equals方法的作用了,覆蓋后一般都是通過對象的內容是否相等來判斷對象是否相等。
3.hashCode的作用
?
hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。
hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode() 函數。
? ? ? ? 雖然,每個Java類都包含hashCode() 函數。但是,僅僅當創建某個“類的散列表”(關于“散列表”見下面說明)時,該類的hashCode() 才有用(作用是:確定該類的每一個對象在散列表中的位置;其它情況下(例如,創建類的單個對象,或者創建類的對象數組等等),類的hashCode() 沒有作用。
? ? ? ?上面的散列表,指的是:Java集合中本質是散列表的類,如HashMap,Hashtable,HashSet。
? ? ? ?也就是說:hashCode() 在散列表中才有用,在其它情況下沒用。在散列表中hashCode() 的作用是獲取對象的散列碼,進而確定該對象在散列表中的位置。
OK!至此,我們搞清楚了:hashCode()的作用是獲取散列碼。
?
equal和hashcode的關系
1、如果兩個對象equals,Java運行時環境會認為他們的hashcode一定相等。?
2、如果兩個對象不equals,他們的hashcode有可能相等。?
3、如果兩個對象hashcode相等,他們不一定equals。?
4、如果兩個對象hashcode不相等,他們一定不equals。?
關于這兩個方法的重要規范:?
規范1:若重寫equals(Object obj)方法,有必要重寫hashcode()方法,確保通過equals(Object obj)方法判斷結果為true的兩個對象具備相等的hashcode()返回值。說得簡單點就是:“如果兩個對象相同,那么他們的hashcode應該相等”。不過請注意:這個只是規范,如果你非要寫一個類讓equals(Object obj)返回true而hashcode()返回兩個不相等的值,編譯和運行都是不會報錯的。不過這樣違反了Java規范,程序也就埋下了BUG。?
規范2:如果equals(Object obj)返回false,即兩個對象“不相同”,并不要求對這兩個對象調用hashcode()方法得到兩個不相同的數。說的簡單點就是:“如果兩個對象不相同,他們的hashcode可能相同”。?
為什么覆蓋equals時總要覆蓋hashCode?
?一個很常見的錯誤根源在于沒有覆蓋hashCode方法。在每個覆蓋了equals方法的類中,也必須覆蓋hashCode方法。如果不這樣做的話,就會違反Object.hashCode的通用約定,從而導致該類無法結合所有基于散列的集合一起正常運作,這樣的集合包括HashMap、HashSet和Hashtable。
1.在應用程序的執行期間,只要對象的equals方法的比較操作所用到的信息沒有被修改,那么對這同一個對象調用多次,hashCode方法都必須始終如一地返回同一個整數。在同一個應用程序的多次執行過程中,每次執行所返回的整數可以不一致。
2.如果兩個對象根據equals()方法比較是相等的,那么調用這兩個對象中任意一個對象的hashCode方法都必須產生同樣的整數結果。
3.如果兩個對象根據equals()方法比較是不相等的,那么調用這兩個對象中任意一個對象的hashCode方法,則不一定要產生相同的整數結果。但是程序員應該知道,給不相等的對象產生截然不同的整數結果,有可能提高散列表的性能。
?
總結
以上是生活随笔為你收集整理的equal、hashcode、==的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java集合:ArrayList和Lin
- 下一篇: Redis: 跳跃表