日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java set hashcode_Java学习笔记_180724_HashSet_hashCode()

發布時間:2024/7/5 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java set hashcode_Java学习笔记_180724_HashSet_hashCode() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HashSet

泛型E必須重寫hashCode方法,否則會導致add結果與預期不符

class NewClass{

String s;

public NewClass(String s){

this.s=s;

}

@override

public int hashCode(){

//此處返回字符串s的hashCode()

return s.hashCode();

}

}

NewClass n = new NewClass("1");

NewClass n1 = new NewClass("1");

Set set= new Set<>();

set.add(n);

set.add(n1);

sout(set.size());

若不重寫hashCode()則輸出為2,若重寫hashCode()則輸出為1。為什么會這樣?

查看HashSet的的源碼會發現,HashSet的Contains方法,和add方法,其實是引用了HashMap的containskey()和put()方法。

而這HashMap的這兩個方法都用到了泛型類的hashCode()

連個方法中的hash()方法代碼如下:

返回值都和泛型E.hashCode()有關,所以當自建類作為泛型類生成HashSet和HashMap時需要重寫自建類的hashCode()。

如果hashCode()沒有重寫,則調用的是java.lang.Object的hashCode()

剛看到這行代碼的時候是懵逼的,沒有方法體,這不是抽象類嗎?然后百度了native修飾符,發現這篇文章寫得很清楚https://www.cnblogs.com/Qian123/p/5702574.html,native是于其他語言(如C++)聯合開發是使用的,也就是說hashCode()方法的方法體是其他語言實現的,具體調用時由JNI(java native interface)調用其他語言生成的庫文件,如dll文件。

總結

以上是生活随笔為你收集整理的java set hashcode_Java学习笔记_180724_HashSet_hashCode()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。