Java中Object类的equals()和hashCode()方法深入解析
来源:互联网 发布:广州软件开发工资 编辑:程序博客网 时间:2024/06/08 15:39
1.equals()
在初学Java的时候,很多人会说在比较对象的时候,==是比较地址,equals()是比较对象的内容,谁说的?
看看equals()方法在Object类中的定义:
public boolean equals(Object obj){
return (this == obj);
}
return (this == obj);
}
这是比较内容么?明显是比较指针(地址)么...
但是为什么会有equals是比较内容的这种说法呢?
因为在String、Double等封装类中,已经重载(overriding)了Object类的equals()方法,于是有了另一种计算公式,是进行内容的比较。
比如在String类中:
public int hashCode() {
int h = hash;
if (h == 0) {
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
int h = hash;
if (h == 0) {
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
2.hashCode()
在Object类中的定义为:
public native int hashCode();
是一个本地方法,返回的对象的地址值。
但是,同样的思路,在String等封装类中对此方法进行了重写。方法调用得到一个计算公式得到的 int值
3.两者的关系
①两个obj,如果equals()相等,hashCode()一定相等
②两个obj,如果hashCode()相等,equals()不一定相等
原因:从散列的角度考虑,不同的对象计算哈希码的时候,可能引起冲突,大家一定还记得数据结构中冲突的解决方案吧
但是要这么设计,用两个函数,个人的理解是为了比较两个对象时更高效。
可以考虑在Java集合中,判断两个对象是否相等的规则是:
第一步,如果hashCode()相等,则查看第二步,否则不相等;
第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。
为什么这样做?个人的理解是让适当的函数完成适当的功能,毕竟hashCode()比equals()在某种程度上来得快。
阅读全文
0 0
- Java中Object类的equals()和hashCode()方法深入解析
- Java中Object类的equals()和hashCode()方法深入解析
- Java中Object类的equals()和hashCode()方法深入解析
- Java中Object类的equals()和hashCode()方法深入解析
- Java中Object类的equals()和hashCode()方法深入解析
- Java中Object类的equals()和hashCode()方法
- Object类中equals,hashCode和toString方法的学习
- Java源码学习-Object类的hashCode和equals方法
- Java中重写Object类的equals方法和hashcode方法的注意事项
- Java中重写Object类的equals方法和Hashcode方法的注意事项
- java中hashCode() 和 equals()方法的解析
- 深入解析Java中的equals()和hashCode()方法
- java Object对象中hashCode和equals方法学习
- Object的hashCode方法和equals方法
- java.lang.Object的equals()和hashCode()方法小结
- Java记录 -57- Object的equals、hashcode和toString方法
- 深入理解Java 中hashcode() 和equals()方法
- JAVA中Object的equals和hashCode的关联
- js的数组知识之深入理解map和reduce
- 一个选择离职的夜晚有感
- numpy基础——numpy.argsort
- 安卓常见控件
- UGUI 类炉石传说箭头效果实现
- Java中Object类的equals()和hashCode()方法深入解析
- 理解CSS雪碧图
- DFS 水题Lake Counting
- 微信公众号平台网页授权接口中获取到的授权code传递给(即一个微信公众号网页授权给)任何其他多个回调域名下的url,解决了只能设置一个网页授权回调域名的问题,解决了redirect_uri参数错误的问
- python中的intern机制
- numpy基础——numpy.tile
- Merge Sort Algorithm
- 1121. Damn Single (25)
- 《自己手动写一个编译器、连接器》一(4)