why在重写equals时还必须重写hashcode方法

why在重写equals时还必须重写hashcode方法

大家好,又见面了,我是全栈君。

首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法

public boolean equals(Object anObject) {

    if (this == anObject) {

        return true;

    }

    if (anObject instanceof String) {

        String anotherString = (String)anObject;

        int n = count;

        if (n == anotherString.count) {

        char v1[] = value;

        char v2[] = anotherString.value;

        int i = offset;

        int j = anotherString.offset;

        while (n– != 0) {

            if (v1[i++] != v2[j++])

            return false;

        }

        return true;

        }

    }

    return false;

    }

public int hashCode() {

    int h = hash;

    if (h == 0) {

        int off = offset;

        char val[] = value;

        int len = count;

            for (int i = 0; i < len; i++) {

                h = 31*h + val[off++];

            }

            hash = h;

        }

        return h;

    }

 

 

那为什么在重写equals方法时都要重写equals方法呢:
首先equals与hashcode间的关系是这样的:

1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)   

自我的理解:由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的

次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用;

我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的

话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,欧码噶的,这个效率可想而知,因此hashcode

就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据

只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。

继续上面的话题,为什么必须要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写

hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的

转载于:https://my.oschina.net/duanvincent/blog/777850

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108816.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 软件开发与软件研发的区别「建议收藏」

    软件开发与软件研发的区别「建议收藏」按:这几天我一直在写这篇东西,本来是胸有成竹,没想到后来越写越发现自己在这个题目下有太多话想说,而以我现在的能力又不能很好地概括总结,以至于越写越长,文章结构也变得混乱,到后来修改的时候每次都要考虑好久才能下笔,所以决定拆成两部分来发,以便阅读。这篇写得我心力交瘁,质量不算好,凑合着看吧。同样是写程序,不同的岗位工作内容不一样,对程序质量以及工程师的要求也不一样。程序开发大概可以划分成两类…

  • 网页设计与制作入门_网页设计基本步骤

    网页设计与制作入门_网页设计基本步骤初涉网页设计

  • JRTPLib的编译步骤「建议收藏」

    JRTPLib的编译步骤「建议收藏」JRTPLib的编译步骤JRTPLib是RTP协议的开源版库,下面讲述在VS2008上面的编译步骤JRTPLIB开源库包括两个jthread.lib和jrtplib.lib下载链接:jthread:http://research.edm.uhasselt.be/%7Ejori/page/index.php?n=CS.Jrtplibjrtplib:http://rese

  • 服务器与矿机的区别_云服务器怎么挖矿

    服务器与矿机的区别_云服务器怎么挖矿矿机与云计算服务器外观区别内容精选换一换华为云人脸识别服务帮助中心,为用户提供产品简介、用户指南、API参考、常见问题等技术文档,帮助您快速上手使用人脸识别服务。云专题为你精心准备的答疑解惑内容,内容主要包括云计算行业相关知识内容,用户常见问题解决方法等来自:其他矿机与云计算服务器外观区别相关内容您可以使用公共镜像、私有镜像或共享镜像创建云服务器。使用公共镜像和私有镜像创建云服务器的区别是:公…

  • 常见数据结构与算法整理总结(下)_常用数据结构与算法

    常见数据结构与算法整理总结(下)_常用数据结构与算法数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。下面是自己整理的常用数据结构与算法相关内容,如有错误

  • Excel与XML相互转换 – C# 简单实现方案[通俗易懂]

    Excel与XML相互转换 – C# 简单实现方案[通俗易懂]Excel与XML相互转换-C#简单实现方案在日常工作中,我需要将数据存储在Excel中进行数据分析和处理,然后再将数据转换为XML格式进行跨平台的数据交换。网上搜索Excel转换为XML的实现方式大都是将Excel读取到数据库的DataSet,然后再写入到xml,代码比较繁琐而且要求运行环境安装数据库。最终我找到了一个简单的Excel与XML相互转换的C#实现方案,运行环境无需安装数据

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号