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()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.搭建主从
- 下一篇: java美元兑换,(Java实现) 美元