吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1380|回复: 3
收起左侧

[Java 转载] 理解“==”和“equals”、hashcode方法

[复制链接]
逸帅 发表于 2021-4-20 19:04

理解“==”和“equals”、hashcode方法

1、“=="和equals方法

在object类中,equals方法其实就是==方法

但是,在大部分的类中,都重写了equals方法和hashcode方法(后面会说),所以equals方法才会比较值是否相等,但是自定义的类,例如你自己定义的person,student类,自然是没重写equals和hashcode的。

2、为什么重写了equals方法,就要重写hashcode方法

第一:因为hashcode的协定,hashcode有如下协定:

  • 两个对象相等,hashcode一定相等
  • 两个对象不等,hashcode不一定不等
  • hashcode相等,两个对象不一定相等
  • hashcode不等,两个对象一定不等

如果只重写了equals方法,那么可能导致两个相等的类,调用equals方法相等,但是hashcode不等,自然也就违背了这个协定

第二:为了hash类的集合,例如hashmap,hashset等,这一类在判定两个对象是否相同时,会先调用hashcode,hashcode相同后,才会调用equals方法,但是如果只重写了equals方法,可能这个equals是相等的,但是默认调用object生成的hashcode是不相等的,从而导致两个本来应该值相等的对象,都插入到了set集合中,这就违背了开发人员的初衷

3、hashcode的作用

通过哈希算法(散列算法),让每个不相等的对象,生成不同的int类型的值,先比较int类型的值,如果相同再通过equals方法进行比较,这样子能提高查找的效率,

4、举个例子

Student s1=new Student("小秋",21);

Student s2=new Student("小秋",21);

程序员想要的效果,肯定是s1要和s2相等,但是在程序看来,s1和s2是两个不同的对象,所以程序员为了让机器把s1和s2看成相同的对象,所以要重写equals方法

加入要把s1和s2存入到hashset中,那么重写equals方法还不够,因为hashset默认会先调用hashcode方法,判断是否相同,如果相同,才会再判断equals方法

但是object的hashcode方法,默认是用地址生成的值,s1和s2是分别new出来的,地址自然不相等,hashcode值也就不相等了

这样子就会导致,hashset里面会把s1和s2都存进去,但是实际上,我们只需要存入一个就够了。


如果有不对的地方,还望各位大佬批评指正!

免费评分

参与人数 2吾爱币 +6 热心值 +2 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
along6 + 1 + 1 互相学习,天天向上

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

along6 发表于 2021-4-20 19:39
==:它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)

因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。

免费评分

参与人数 1热心值 +1 收起 理由
逸帅 + 1 感谢补充

查看全部评分

 楼主| 逸帅 发表于 2021-4-20 20:51
along6 发表于 2021-4-20 19:39
==:它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是 ...

感谢补充
 楼主| 逸帅 发表于 2021-4-21 00:01
ljhtoljh 发表于 2021-4-20 23:28
在这论坛就别写这个了,简直就是制造文字垃圾一样,转csdn、博客园等不好吗

编程区是用来发编程类知识的,不是让你来杠的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-12 15:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表