HashCode的作用

    在有些集合存储对象的时候会用到HashCode,在默认情况下java会为每个对象生成一个HashCode值,如果一个集合里面存储的对象不希望是对象的值相等的,那么就要拿着这个要添加的值逐一的跟集合里面对象的值相比较,当集合里面的对象非常大的时候,显然效率是非常低的,这个时候用HashCode就会自动为这个集合分配多个区域,然后在生成对象的HashCode值的时候就会属于某一个区域,然后就跟相对应的区域进行比较就可以了,这就好比现实中你拿了一张扑克牌(假如是红心5吧)跟一堆牌里相比较,看有没有这张,那显然如果一张一张的看是非常浪费时间的,我们平常用的方法就是把它们按各种花形分配好,然后直接去看红桃里面有没有就可以了,HashCode就跟这个类似,但在程序中即便是值相等的对象所分配的的HashCode区域也可能是不同的,如果它刚好跑到别的区域去想找,那就会把有可能相等的对象添加进去,为了解决这一问题,我们此时就要重写HashCode与equals方法,这样就保证让值相同的元素在同一个区域里,然后就不会出现重复的现象了。下面是一个小例子:

Collection con=new HashSet();
  Student s1=new Student("张三",15);
  Student s2=new Student("李四",15);
  Student s3=new Student("张三",15);
  con.add(s1);
  con.add(s2);
  con.add(s3);
  System.out.println(con.size());

 

上面的结果在没有重写HashCode的时候结果是3,但如果重写之后就会在同一区域里想找,所以结果就是2.

 

在此还要注意一点如果在添加这后你修改了某个对象的值,然后你再删除该对象的时候就有可能无效了,因为一但对象元素的值改变了,它所生成的HashCode值也就会跟着改变,那么它在删除的时候就会去其它的区域找了,自然就找不到也就删除不了了,这样的话如果程序当中有些已经不要的元素而没有及时的删除掉,多了的话就会出现内存泄漏的问题,这点要特别注意。如:

 

Collection con=new HashSet();
  Student s1=new Student("张三",15);
  Student s2=new Student("李四",15);
  Student s3=new Student("张三",15);
  con.add(s1);
  con.add(s2);
  con.add(s3);
  s1.setAge(20);
  con.remove(s1);
  System.out.println(con.size());

 

这个运行之后的结果同样是2,也就是没删除成功。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值