Object:equals()、hashCode()、toString()
程序员文章站
2022-04-19 18:24:17
...
Java中,Object类是所有类的祖宗,他们都直接或间接的继承了Object。如果一个类没有使用extends关键字继承另一个类,默认继承Object类。
Object类的几个重要方法:
1、equals()
废话不多说,直接看源码,
public boolean equals(Object obj){
return (this == obj);
}
如果我们没有重写equals()的话,对象会调用到父类Object的equals()方法,判断调用对象和传入的参数对象的内存地址是否相等( == 用来比较引用类型数据的内存地址是否相等,如果不相等,就说明是两个对象)。
String类重写了equals()方法,可以用于字符串的比较,源码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
2、toString()
该方法用于打印对象的字符串形式。
如果不重写toString方法,在打印对象的时候,会调用到Object类的toString方法,会打印对象地址。看源码:
//Object中的toString()方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
String类重写了toString()方法
public String toString() {
return this;
}
3、hashCode()
-
同一个对象生成多次hash值,值一定是一样的
-
不同对象,生成的值,可能相同,产生哈希冲突,需要用equals()方法,比较哈希值相同的对象的内容是否一样
-
在java中可以通过 hashCode和equals来确定对象的唯一性
equals()与hashCode()的联系:
-
(1)由于Object类的equals()用来比较内存地址,如果两个对象的equals()结果为true,那么这两个对象的hashCode一定相同;
-
(2)两个对象的hashCode()结果相同,并不能代表两个对象的equals()一定为true,只能够说明这两个对象在一个散列存储结构中。
-
(3)如果对象的equals()被重写,那么对象的hashCode()也要重写。
为啥重写equals()就要重写hashCode() ?
以hashSet集合()为例,这个集合是不允许有重复元素的。如果我们只是重写了equals(),而没有重写hashCode() ,会导致集合元素不唯一。因为我们都是先根据hashCode()方法算出对象的哈希值,如果哈希值不同,肯定不是一个对象,也就不用equals()进行比较;如果哈希值相等,在用equals()判断内容是否相等。如果不重写hashCode(),两个对象的哈希值肯定不一样(Object类的hashCode()返回的对象内存地址永远不会相同),也就是这两个对象不在一个散列区域,都不需要equals()比较,就直接存进去了。
下一篇: jdk源码之LinkedList
推荐阅读
-
why在重写equals时还必须重写hashcode方法分享
-
java中hashCode方法与equals方法的用法总结
-
Java Set接口contains(Object o)方法与对象hashCode()方法的关系梳理
-
java中hashCode、equals的使用方法教程
-
why在重写equals时还必须重写hashcode方法分享
-
java中hashCode方法与equals方法的用法总结
-
重写hashCode()和equals()方法详细介绍
-
java中hashCode、equals的使用方法教程
-
重写hashCode()和equals()方法详细介绍
-
Java 中的 equals,==与 hashCode 的区别与联系