没有合适的资源?快使用搜索试试~ 我知道了~
equals 和 hashCode两者效果分析详解.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 124 浏览量
2022-07-02
22:02:33
上传
评论
收藏 115KB DOCX 举报
温馨提示
试读
11页
但是为什么JavaDoc明确的告诉我们, hashCode()和equals()要一起重写呢?原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点我们一会再谈。 那么我们还是单独来看hashCode(),为什么HashMap需要用到hashCode?这个就涉及到HashMap底层的数据结构 – 散列表的原理: HashMap底层用于存储数据的结构其实是散列表(也叫哈希表),散列表是通过哈希函数将元素映射到数组指定下标位置, 在Java中,这个哈希函数其实就是hashCode()方法。
资源推荐
资源详情
资源评论
equals 在 Java 中含义
首先要解释清楚这个,equals 方法在 J a va 中代表逻辑上的相等,什么叫逻辑
上的相等?这个就涉及到 Java 本身的语法特性。
我们知道,Java 中存在着==来判断基本数据类型的相等,但是对于对象,==
只能判断内存地址是否相等,也就是说是否是同一个对象:
int a = 10000;
int b = 10000;
// 对于基本数据类型, == 可以判断逻辑上的相等
System.out.println(a == b);
Integer objA = 10000;
Integer objB = 10000;
Integer objA1 = objA;
// 对于类实例, == 只能判断是否为同一个实例(可以视为内存地址是否相等)
System.out.println(objA == objB);
System.out.println(objA == objA1);
注:这里我们不讨论 Integer 对于-128~127 的缓存机制。
结果显而易见:
但是明明objA 和 objB 逻辑上是相等的,凭什么你就返回 false?这时就诞生
了一种需求,对于 Java 中的对象,要判断逻辑相等,该怎么实现呢,于是就
出现了`equals()`方法。
Integer objA = 10000;
Integer objB = 10000;
Integer objA1 = objA;
// 对于对象实例, equals 可以判断两个对象是否逻辑相等
System.out.println(objA.equals(objB));
Integer 类已经重写了**equals()**方法,所以结果也显而易见:
因此如果我们自己创建一个类的话,要实现判断两个实例逻辑上是否相等,就
需要重写他的[equals()](http://mp.weixin.qq.com/s?
__biz=MzI3ODcxMzQzMw==&mid=2247495256&idx=1&sn=5af5a0045edcbde3b0
716e83e69870b3&chksm=eb506b6edc27e27833049c20337cb99cdb1fdce00c53
591b1730f42441876d8d2975de010f1a&scene=21#wechat_redirect)方法。
// 重写了 equals 方法的类
staticclass GoodExample {
private String name;
privateint age;
public GoodExample(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) returntrue;
if (o == null || getClass() != o.getClass()) returnfalse;
GoodExample that = (GoodExample) o;
return age == that.age &&
Objects.equals(name, that.name);
}
}
// 没有重写 euqals 方法的类
staticclass BadExample {
private String nakeName;
privateint age;
public BadExample(String nakeName, int age) {
this.nakeName = nakeName;
this.age = age;
}
}
public static void main(String\[\] args) {
System.out.println(new GoodExample("Richard", 36).
equals(new GoodExample("Richard", 36)));
System.out.println(new BadExample("Richard", 36).
equals(new BadExample("Richard", 36)));
}
相信你已经知道结果是什么了:
2、hashCode 在 Java 中的作用
网上有很多博客都把 hashCode()和 equals()混为一谈,但实际上
hashCode()就是他的字面意思,代表这个对象的哈希码。
但是为什么 JavaDoc 明确的告诉我们,hashCode()和 equals()要一起重写呢?
原因是因为,在 Java 自带的容器 HashMap 和 HashSet 中,都需同时要用到对
象的 hashCode()和 equals()方法来进行判断,然后再插入删除元素,这点我
们一会再谈。
剩余10页未读,继续阅读
资源评论
小兔子平安
- 粉丝: 209
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功