软件构造随笔四-hashcode方法的重写

之前一直忙于完成lab3及报告,距上一次发博客过了好长时间。
在本次博客里,主要想分享一下我在lab3中学到和应用到的知识。(本次博客主要参考《effective java 》第二版)

hashcode方法的约定

在这里插入图片描述

以上内容来自《effective java 》第二版第三章。
之前对hashcode方法只是有简单的了解,在阅读了相关的书籍后,尤其是上图的三条约定,我能更好的使用该方法。
hashcode方法对基于散列的集合如HashSet,HashMap等的正确运行非常重要。

hashcode方法的重写

在之前的实验和课程中,都或多或少地接触到了需要重写equals方法的地方,不过在之前为了方便起见,我都是
采用等价的字符串比较来代替,但在lab3中,一是有些类的比较确实需要equals方法,二是为了学点新知识,我选
择重写equals方法和hashcode方法。
在我目前见过的情况中,重写hashcode方法一般都是因为重写了equals方法,对equals方法的重写非常简单,
比如对如下的类重写equals方法:
在这里插入图片描述
在这里插入图片描述
如果仅是这样的处理,在使用List,HashMap等容器时就会发生错误。(详细错误原因分析见“软件构造随笔二”,这里不赘述了)

所以,我们必须得重写hashcode方法,在之前,我没有经常使用equals方法的原因也在是因为对该方法不熟悉,容易出错。

首先第一种策略很简单:
在这里插入图片描述
这种方法正如注释中所说,是正确的但是最不好的做法。这样虽然确保了每个相等的对象有相同的hash值,实际上,所有对象虽有相同的hash值,这样会让散列桶退化为链表当散列桶的规模很大时,这有可能会导致错误的出现

一个很有效且很简单的方法如下:

在这里插入图片描述
这里用到的areaCode,prefix,lineNumber就是我们在equals方法中想要比较的变量。

具体的规则可以参考下图:
在这里插入图片描述

而在对result的乘法中使用31的原因如下,这点让我有眼前一亮的感觉,只能说大师就是大师,选择的数非常巧妙:

31首先是一个素数这很明显,其次,31的乘法可以用移位和减法来完成

31*i==(i<5)-i;

且现代的虚拟机可以自动做这种优化,大大降低了计算所需的代价。

目前我学到的就是这些,之后希望还能坚持继续读《effective java》的第三章,对本篇博客进一步完善。

上如内容如有错误欢迎指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值