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

网上做翻译兼职网站/今日最新消息

网上做翻译兼职网站,今日最新消息,岳阳临湘疫情最新消息,怎样把已经有的网站做推广这是Java中很经典的问题,在面试中也经常被问起。其实很多书或者文章都提到过要重载hashCode()和equals()两个方法才能实现自定义键在HashMap中的查找,但是为什么要这样以及如果不这样做会产生什么后果,好像很少有文章讲到,所以写这…

这是Java中很经典的问题,在面试中也经常被问起。其实很多书或者文章都提到过要重载hashCode()equals()两个方法才能实现自定义键在HashMap中的查找,但是为什么要这样以及如果不这样做会产生什么后果,好像很少有文章讲到,所以写这么一篇来说明下。

首先,如果我们直接用以下的Person类作为键,存入HashMap中,会发生发生什么情况呢?

public class Person {private String id;public Person(String id) {this.id = id;}
}
import java.util.HashMap;public class Main {public static void main(String[] args) {HashMap<Person, String> map = new HashMap<Person, String>();map.put(new Person("001"), "findingsea");map.put(new Person("002"), "linyin");map.put(new Person("003"), "henrylin");map.put(new Person("003"), "findingsealy");System.out.println(map.toString());System.out.println(map.get(new Person("001")));System.out.println(map.get(new Person("002")));System.out.println(map.get(new Person("003")));}
}

那么输出结果是什么呢?

{Person@6e4d4d5e=henrylin, Person@275cea3=findingsea, Person@15128ee5=findingsealy, Person@4513098=linyin}
null
null
null

我们可以看到,这里出现了两个问题:

  1. 在添加的过程中,我们将key=new Person("003")的键值对添加了两次,那么在期望中,HashMap中应该只存在一对这样的键值对,因为key(期望中)是相同的,所以不应该重复添加,第二次添加的value="findingsealy"应该替换掉原先的value="henrylin"。但是在输入中,我们发现期望中的情况并没有出现,而是在HashMap同时存在了value="findingsealy"value="henrylin"的两个键值对,并且它们的key值还是不相同的,这显然是错误的。

  2. 在获取value值时,我们分别用三个Person对象去查找,这三个对象和我们刚刚存入的三个key值(在期望中)是相同的,但是查找出的却是三个null值,这显然也是错误的。

那么,正确的方法其实在很多地方都是被描述过了,直接对Person类进行修改,重载equalshashCode方法,修改过后的Person类如下:

public class Person {private String id;public Person(String id) {this.id = id;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;if (id != null ? !id.equals(person.id) : person.id != null) return false;return true;}@Overridepublic int hashCode() {return id != null ? id.hashCode() : 0;}
}

那么,当我们重新执行上述的检验程序时,得到的结果如下:

{Person@ba31=findingsea, Person@ba32=linyin, Person@ba33=findingsealy}
findingsea
linyin
findingsealy

可以看到,之前指出的亮点错误都得到了改正。那么,为什么会这样呢?

HashMap中,查找key的比较顺序为:

  1. 计算对象的Hash Code,看在表中是否存在。
  2. 检查对应Hash Code位置中的对象和当前对象是否相等。

显然,第一步就是要用到hashCode()方法,而第二步就是要用到equals()方法。在没有进行重载时,在这两步会默认调用Object类的这两个方法,而在Object中,Hash Code的计算方法是根据对象的地址进行计算的,那两个Person("003")的对象地址是不同的,所以它们的Hash Code也不同,自然HashMap也不会把它们当成是同一个key了。同时,在Object默认的equals()中,也是根据对象的地址进行比较,自然一个Person("003")和另一个Person("003")是不相等的。

理解了这一点,就很容易搞清楚为什么需要同时重载hashCode()equals两个方法了。

  • 重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。
  • 重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。

还有一个细节,在Person类中对于hashCode()的重在方法为:

@Override
public int hashCode() {return id != null ? id.hashCode() : 0;
}

这里可能有疑惑的点在于:为什么可以用String类型的变量的Hash Code作为Person类的Hash Code值呢?这样new Person(new String("003"))new Person(new String("003"))Hash Code是相等的吗?

来看看以下代码的输出:

System.out.println("findingsea".hashCode());
System.out.println("findingsea".hashCode());
System.out.println(new String("findingsea").hashCode());
System.out.println(new String("findingsea").hashCode());
728795174
728795174
728795174
728795174

可以看到四条语句的输出都是相等的,很直观的合理的猜测就是String类型也重载了hashCode()以根据字符串的内容来返回Hash Code值,所以相同内容的字符串具有相同的Hash Code

同时,这也说明了一个问题:为什么在已知hashCode()相等的情况下,还需要用equals()进行比较呢?就是因为避免出现上述例子中的出现的情况,因为根据对Person类的hashCode()方法的重载实现,Person类会直接用id这个String类型成员的Hash Code值作为自己的Hash Code值,但是很显然的,一个Person("003")和一个String("003")是不相等的,所以在hashCode()相等的情况下,还需要用equals()进行比较。

以下例子可以作为上述说明的佐证:

System.out.println(new Person("003").hashCode()); // 47667
System.out.println(new String("003").hashCode()); // 47667System.out.println(new Person("003").equals(new String("003"))); // false

http://www.lbrq.cn/news/1319545.html

相关文章:

  • 网站建设新模式/磁力宝最佳搜索引擎入口
  • 网站建设公司问候语/友情链接检查工具
  • 中国的网站域名是什么/南京seo外包平台
  • 云空间免费空间/网站seo方法
  • 做自主外贸网站和后台费用多少/aso优化平台
  • 做网站用php还是java/腾讯营销平台
  • 怎嘛做网站/5188关键词挖掘
  • C#如何做简易网站/怎么样引流顾客到店方法
  • 最新的网站开发框架/抖音引流推广免费软件app
  • 网页设计实训体会/湖南优化电商服务有限公司
  • 仿站软件/百度搜索引擎广告位的投放
  • 电子网站风格设计/日结app推广联盟
  • 电商运营怎么做的/宁波seo排名外包
  • 企业网站建设与运营计划书/seo网站推广招聘
  • 重庆房产网/河北百度seo关键词
  • 怎么提高网站收录/销售平台有哪些
  • 陕西网站建设优化建站/企业文化的重要性
  • ui交互设计是什么意思/宁波seo外包引流推广
  • 网站如何做淘宝支付宝支付/珠海百度搜索排名优化
  • 烟台外贸网站建设公司/网络营销策划书模板
  • 企业网站建设研究目的意义/游戏推广员上班靠谱吗
  • 嘉兴建企业网站/怀化seo推广
  • 医疗网站建设公司/培训机构招生方案范文
  • seo网站权重/幽默软文广告经典案例
  • 东莞做网站要多少钱/国家卫健委最新疫情报告
  • 网站砍价活动怎么做/微信客户管理系统
  • 企业网站排版规则/怎样在平台上发布信息推广
  • 整站wordpress下载/网站运营
  • 做网站的专业叫啥/seo诊断优化专家
  • 做网站培训/站长工具whois查询
  • WPF TreeView自带自定义滚动条
  • Docker状况监控
  • Java WEB技术-序列化和反序列化认识(SpringBoot的Jackson序列化行为?如何打破序列化过程的驼峰规则?如何解决学序列化循环引用问题?)
  • python每日一题练习---简单题目
  • SpringBoot实战:高效Web开发
  • Java实习面试记录