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)


相关推荐

  • 【java】反射

    【java】反射https://blog.csdn.net/aiming66/article/details/851254871、什么是反射技术?动态获取指定类以及类中的内容(成员),并运行其内容。应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象。这时可以根据配置文件的类全名去找对应的字节码文件,并加载进内存,并创建该类对象实例。这就需要使用反射技术完成2、获取class对象的方式2.1…

  • top命令输出解释以及load average 详解及排查思路

    top命令输出解释以及load average 详解及排查思路昨天nagios报警warning,没来得及留下报警截图,nagios值设定的值是当1分钟多于15个进程等待,5分钟多于10个,15分钟多于5个则为warning状态当1分钟多于30个进程等待,5分钟多于25个,15分钟多于20个则为critical状态————————————————————-

  • Java栈实现[通俗易懂]

    Java栈实现[通俗易懂]数组实现的栈一:优点:插入和删除很快,缺点:长度有限publicclassStack{ privateinttop=-1; privateObject[]objs; publicStack()throwsException{ this(10); } publicStack(intcapacity)throwsExceptio

  • oracle恢复删除数据

    oracle恢复删除数据1。select*fromznjtresource.t_device_epoliceasoftimestampto_timestamp(‘2019-3-2115:20:00′,’yyyy-mm-ddhh24:mi:ss’)2,。insertintoznjtresource.t_device_epolice(select*fromznjtresource.t_devi…

  • ffplay使用

    ffplay使用1.ffplay是什么?简单的说,ffplay是一个使用了ffmpeg和sdl库的、一个简单的可移植的媒体播放器。2.ffplay使用方式命令行:ffplay[选项][‘输入文件’]3.ffplay可使用的选项3.1通用选项viewsourceprint?01.’-L’    显示lice

  • matlab 汽车振动,matlab在汽车振动分析

    matlab 汽车振动,matlab在汽车振动分析matlab在汽车振动分析Matlab在振动分析中的应用刘迪辉2011-10-20大家学了游泳理论,现在我们借助MATLAB软件,来练习一下游泳!实际问题:客车的振动分析•客车样车路试过程中却出现了令人意想不到的一系列振动问题,主要表现为:(1)汽车起动时发动机抖动厉害;(2)当车速在40km/h左右时,整车有共振现象;(3)当车速在85km/h左右时,…

    2022年10月16日

发表回复

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

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