hashCode和identityHashCode的區別你知道嗎?
轉載自 hashCode和identityHashCode的區別你知道嗎?
hashCode
關於hashCode參考之前的文章,點選參考之前文章。
identityHashCode
identityHashCode是System裡面提供的本地方法,java.lang.System#identityHashCode。
/** * Returns the same hash code for the given object as * would be returned by the default method hashCode(), * whether or not the given object's class overrides * hashCode(). * The hash code for the null reference is zero. * * @param x object for which the hashCode is to be calculated * @return the hashCode * @since JDK1.1 */ public static native int identityHashCode(Object x);
identityHashCode和hashCode的區別是,identityHashCode會返回物件的hashCode,而不管物件是否重寫了hashCode方法。
示例
public static void main(String[] args) { String str1 = new String("abc"); String str2 = new String("abc"); System.out.println("str1 hashCode: " + str1.hashCode()); System.out.println("str2 hashCode: " + str2.hashCode()); System.out.println("str1 identityHashCode: " + System.identityHashCode(str1)); System.out.println("str2 identityHashCode: " + System.identityHashCode(str2)); User user = new User("test", 1); System.out.println("user hashCode: " + user.hashCode()); System.out.println("user identityHashCode: " + System.identityHashCode(user)); }
輸出結果:
str1 hashCode: 96354 str2 hashCode: 96354 str1 identityHashCode: 1173230247 str2 identityHashCode: 856419764 user hashCode: 621009875 user identityHashCode: 621009875
結果分析:
1、str1和str2的hashCode是相同的,是因為String類重寫了hashCode方法,它根據String的值來確定hashCode的值,所以只要值一樣,hashCode就會一樣。
2、str1和str2的identityHashCode不一樣,雖然String重寫了hashCode方法,identityHashCode永遠返回根據物件實體記憶體地址產生的hash值,所以每個String物件的實體地址不一樣,identityHashCode也會不一樣。
3、User物件沒重寫hashCode方法,所以hashCode和identityHashCode返回的值一樣。
結論
hashCode方法可以被重寫並返回重寫後的值,identityHashCode會返回物件的hash值而不管物件是否重寫了hashCode方法。
相關文章
- 你真的知道 == 和 equals 的區別嗎?
- 你知道void和Void的區別嗎
- Python中is和==的區別有多大,你知道嗎?Python
- 小青柑和柑普茶的區別你知道嗎?
- equals()和hashCode()的區別
- 你知道「編譯」與「解釋」的區別嗎?編譯
- 你還不知道mysql中空值和null值的區別嗎?MySqlNull
- 今天的考核題目: 你知道React和Vue的區別嗎? skr,skrReactVue
- 你真的懂 == 和 equals 的區別嗎?
- Java基礎- ==和equals和hashCode的區別Java
- 嵌入式工程師,你知道.c檔案和.h的區別嗎?工程師
- hashCode()和equals()的區別?(skycto JEEditor)
- 菜鳥學Java(二十)——你知道long和Long有什麼區別嗎?Java
- 因特爾CPU i5和i7的區別在哪裡,你知道嗎?
- 你真的瞭解 NDK 和 jni 的區別嗎
- 華為nova8和榮耀50最大的區別是什麼知道嗎?你i哪個
- 你知道 go 切片的 copy 和 view 嗎GoView
- http與https的區別我真的知道嗎HTTP
- 第三方軟體測評▏web測試和app測試的區別你知道嗎?WebAPP
- 有人瞭解 paas 和元件化嗎,想知道這 2 個的區別元件化
- 持續測試跟自動化測試的這些區別你知道嗎?
- 程式設計師必須搞清的概念equals和=和hashcode的區別程式設計師
- 網路釣魚 你知道如何識別嗎?
- 你真的理解@import和link引入樣式的區別嗎Import
- 關於Ae和Pr的的區別,你瞭解對了嗎?
- 效能測試的分類、區別以及特點這些你都知道了嗎?
- 一體成型電感與功率電感有什麼區別你知道嗎
- 深知區塊鏈,可你知道區塊鏈的專業術語嗎?區塊鏈
- HTTP vs HTTPS: 網路通訊的加密之爭!你真的知道它們的區別嗎?HTTP加密
- 你真的知道JS嗎JS
- Go SliceHeader 和 StringHeader,你知道嗎?GoHeader
- SQLSERVER 的 truncate 和 delete 有區別嗎?SQLServerdelete
- 低程式碼&無程式碼,你知道該怎麼區分和選擇嗎?
- Flutter系列四:你真的瞭解StatelessWidget和StatefulWidget的區別嗎?Flutter
- 辨別高防伺服器的四種方法你知道嗎伺服器
- Python六大資料型別,你知道嗎?Python大資料資料型別
- 區塊鏈的那些事,你知道和不知道的都在這裡!區塊鏈
- 你真的知道js的原型鏈嗎??JS原型