当前位置: 首页>前端>正文

java po重写hashcode java hashcode 重写

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

java po重写hashcode java hashcode 重写,java po重写hashcode java hashcode 重写_字符串比较,第1张

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

hashcode方法的重写

在之前的实验和课程中,都或多或少地接触到了需要重写equals方法的地方,不过在之前为了方便起见,我都是

采用等价的字符串比较来代替,但在lab3中,一是有些类的比较确实需要equals方法,二是为了学点新知识,我选

择重写equals方法和hashcode方法。

在我目前见过的情况中,重写hashcode方法一般都是因为重写了equals方法,对equals方法的重写非常简单,

比如对如下的类重写equals方法:

java po重写hashcode java hashcode 重写,java po重写hashcode java hashcode 重写_java_02,第2张

java po重写hashcode java hashcode 重写,java po重写hashcode java hashcode 重写_java_03,第3张

如果仅是这样的处理,在使用List,HashMap等容器时就会发生错误。(详细错误原因分析见“软件构造随笔二”,这里不赘述了)

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

首先第一种策略很简单:

java po重写hashcode java hashcode 重写,java po重写hashcode java hashcode 重写_字符串比较_04,第4张

这种方法正如注释中所说,是正确的但是最不好的做法。这样虽然确保了每个相等的对象有相同的hash值,实际上,所有对象虽有相同的hash值,这样会让散列桶退化为链表当散列桶的规模很大时,这有可能会导致错误的出现

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

java po重写hashcode java hashcode 重写,java po重写hashcode java hashcode 重写_java_05,第5张

这里用到的areaCode,prefix,lineNumber就是我们在equals方法中想要比较的变量。具体的规则可以参考下图:

java po重写hashcode java hashcode 重写,java po重写hashcode java hashcode 重写_java po重写hashcode_06,第6张

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

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

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

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

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

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



https://www.xamrdz.com/web/2mg1963494.html

相关文章: