無論何時這個equals方法被重寫那么都是有必要去重寫hashCode方法,這個是因為為了維持hashCode的一種約定,相同的對象必須要有相同的hashCode值。 -------------------------------------------------------------------------------------------- equals方法的結果為false,那么hashCode方法返回的結果可以相同也可以不相同。 --------------------------------------------------------------------------------------------- hashcode是Object中的函數,所有類都擁有的一個函數,主要返回每個對象的hash值,主要用于哈希表中,如HashMap、HashTable、HashSet。 哈希碼的通用約定如下: 在java程序執(zhí)行過程中,在一個對象沒有被改變的前提下,無論這個對象被調用多少次,hashCode方法都會返回相同的整數值。對象的哈希碼沒有必要在不同的程序中保持相同的值。 如果2個對象使用equals方法進行比較并且相同的話,那么這2個對象的hashCode方法的值也必須相等。 如果根據equals方法,得到兩個對象不相等,那么這2個對象的hashCode值不需要必須不相同。但是,不相等的對象的hashCode值不同的話可以提高哈希表的性能。 由下圖可以看到,hashCode是一個native方法,看不到實現(xiàn),注解中說hashCode返回的是由對象存儲地址轉化得到的值,是否如此,可以看源碼一探究竟。
先給結論: java6、7默認是返回隨機數 java8默認是通過和當前線程有關的一個隨機數+三個確定值,運用Marsaglia’s xorshift scheme隨機數算法得到的一個隨機數 源碼探索過程可以參考: https://fangjian0423./2016/03/12/java-Object-method/ 參考https:///entry/5968876df265da6c232898c2 https://fangjian0423./2016/03/12/java-Object-method/ --------------------------------------------------------------------------------------------------------------------------------------------- Java Object.hashCode()返回的是對象內存地址?基于OpenJDK 8一直以為Java Object.hashCode()的結果就是通過對象的內存地址做相關運算得到的,但是無意在網上看到有相應的意見爭論,故抽時間從源碼層面驗證了剖析了hashCode的默認計算方法。 先說結論:OpenJDK8 默認hashCode的計算方法是通過和當前線程有關的一個隨機數+三個確定值,運用Marsaglia's xorshift scheme隨機數算法得到的一個隨機數。和對象內存地址無關。
- ---------------------------------------------------------------------------------------------------------------------------------------------
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果為false。
對象是放在堆中的,棧中存放的是對象的引用(地址)。由此可見'=='是對棧中的值進行比較的。如果要比較堆中對象的內容是否相同,那么就要重寫equals方法了。
|