ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

哈工大软件构造实验三关于Set,Map,List中内容比较的问题

2021-07-05 20:29:30  阅读:172  来源: 互联网

标签:Map Set Object equals hashCode 哈工大 contains null 方法


在编写哈工大软件构造实验三的过程中,我发现所有的继承Collection接口的接口,例如Set,Map,List,Iterator接口中关于contains和equals方法在比较的时候都是对引用的比较,也就是对于这些类里保存的对象,就算是内容完全相同,但是不指向同样的地址,就算它们不相同,这就造成了一个困扰,假设事先已经将一个元素存进这些类中,当我们想判断我们控制台输入的元素是否包含在这个所给类里面的时候,不管内容是否相同,只要引用不同就会判断为不相等。下面看个例子。

上述代码的输出为:

程序中添加了两只白色的小狗到集合dogSet中. 且 size()方法显示有2只白色的小狗.但为什么用 contains()方法来判断时却提示没有白色的小狗呢?

Set的contains(Object o) 方法详解
Java的API文档指出: 当且仅当 本set包含一个元素 e,并且满足(o==null ? e==null : o.equals(e))条件时,contains()方法才返回true. 因此 contains()方法 必定使用equals方法来检查是否相等.
需要注意的是: set 中是可以包含 null值的(常见的集合类都可以包含null值). 所以如果添加了null,然后判断是否包含null,将会返回true,代码如下所示:

Java的根类Object定义了  public boolean equals(Object obj) 方法.因此所有的对象,包括数组(array,[]),都实现了此方法。
在自定义类里,如果没有明确地重写(override)此方法,那么就会使用Object类的默认实现.即只有两个对象(引用)指向同一块内存地址(即同一个实际对象, x==y为true)时,才会返回true。
如果把Dog类修改为如下代码,能实现我们的目标吗?

英文答案是: no.

问题的关键在于 Java中hashCode与equals方法的紧密联系. hashCode() 是Object类定义的另一个基础方法.

equals()与hashCode()方法之间的设计实现原则为:
如果两个对象相等(使用equals()方法),那么必须拥有相同的哈希码(使用hashCode()方法).
即使两个对象有相同的哈希值(hash code),他们不一定相等.意思就是: 多个不同的对象,可以返回同一个hash值.

hashCode()的默认实现是为不同的对象返回不同的整数.有一个设计原则是,hashCode对于同一个对象,不管内部怎么改变,应该都返回相同的整数值.
在上面的例子中,因为未定义自己的hashCode()实现,因此默认实现对两个对象返回两个不同的整数,这种情况破坏了约定原则。

解决方法:

但是上面的hashCode实现,要求Dog的color是不变的.否则会出现如下的这种困惑:

参考文章: 
http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html

标签:Map,Set,Object,equals,hashCode,哈工大,contains,null,方法
来源: https://blog.csdn.net/lin88556/article/details/118497405

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有