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()方法。

dda00e7f20eb45334358736843e3afe3.png

而这HashMap的这两个方法都用到了泛型类的hashCode()

6ad364bba8ce681ef25db484751a15a5.png

连个方法中的hash()方法代码如下:

4e5da0acbd3e2a1e672649e144b7d8a8.png

返回值都和泛型E.hashCode()有关,所以当自建类作为泛型类生成HashSet和HashMap时需要重写自建类的hashCode()。

如果hashCode()没有重写,则调用的是java.lang.Object的hashCode()

eccc744180b17e3ceaa3db7a12bc0f6f.png

刚看到这行代码的时候是懵逼的,没有方法体,这不是抽象类吗?然后百度了native修饰符,发现这篇文章写得很清楚https://www.cnblogs.com/Qian123/p/5702574.html,native是于其他语言(如C++)联合开发是使用的,也就是说hashCode()方法的方法体是其他语言实现的,具体调用时由JNI(java native interface)调用其他语言生成的库文件,如dll文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值