Object类之toString方法和equals方法
Object类之toString方法和equals方法
位于rt.jar\java\lang\Object.class
注意:Object类是所有类的父类(Java中只有一个根基类,C++中有多个),若没有明确使用extends关键字明确表示该类继承哪个类,那么它就默认继承Object类,也就可以使用Object中的方法:
所有对象,包括数组,都实现了Object类的方法。
我们写的所有的类都是Object的子类会继承Object这个类所有的属性和所有的方法:
1) Object中有3个非常重要的方法 hashcode(), toString(), equals(),sun都是建议我们写自己的类的时候,最好都重写上述3个方法
1.toString()方法
描述对象的方法,用一个文本信息来描述当前对象 ,一般是把属性显示出来.
- 默认调用toString方法的时候,返回的结果:
包名.类名@hashcode;
必须重写该方法 - 当输出对象的名字的时候,系统就会默认去调用
toString()方法
Object a = new Object();
String b = a.toString();//获得一个对象的字符串,表示形式是一个地址
System.out.println(b);
輸出:aaa@qq.com
类名(对象是该类的一个实列)aaa@qq.com+此对象哈希码的无符号十六进制
2 “==”与equals()
- a) “==” : 比较的是基本数据类型的对象,是否相等
eg :
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1==p2);//false
p1==p2 :比較的是内存地址值,不相等
- b) “equals”:是sun专门用来判断两个对象属性是否相等
方法
3 equals():
- a) equals()为什么需要重写?
默认的是比较两个对象的引用是否是同一地址
重写equals()方法后,让他们指向同一个引用,可以判断对象的属性相等
@Override
public boolean equals(Object obj) {
//参数的特殊情况
//null, this, 类型不一致
if(obj==null) return false;
if(obj==this) return true;
if(!(obj instanceof Point)) return false;
Point p = (Point) obj;
return x == p.x &&
y == p.y;
}
String s1 =p1.toString();//获得一个对象的字符串,toString()已被重写
System.out.println(s1);
Object a = new Object();
String b = a.toString();//获得一个对象的字符串,表示形式是一个地址
System.out.println(b);
Point p2 = new Point(3,4);
String s2 = p2.toString();
System.out.println(s2);
/**重写equals()方法后,输出p1==p2:false,p1.equals(p2):true*/
System.out.println(p1==p2);//==比较的是对象内存地址 -false
System.out.println(p1.equals(p2)); //重写equals方法后,它比较的是对象内部属性-true
重写equals()方法后,输出p1==p2:false,p1.equals(p2):true
4 hashCode():
a)hashCode:创建对象在堆内存中的地址值经过一系列
非常复杂的算法转化而来的一组数字,对开发来说无意义
b)如果两个对象相等话,
第1个条件:equals返回的结果必须是true
第2个条件:必须要有相等的hashCode
c)如果两个对象不相等,则hashCode值一定不等
d)判断对象是否相等的时候,必须要重写equals和
hashCode
5instanceof
判断一个对象是否是某个类的对象
格式: 对象 instanceof 类名
如果是返回true,否则false
if(obj instanceof Point){
Point p = (Point) obj;
Object类中的toString(),equals(), hashCode()方法之间的关系
-
1、在没有重写之前:
1) toString()方法返回的是对象的:Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + ‘@’ + Integer.toHexString(hashCode()) 比如:aaa@qq.com
2) equals():对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)克隆的对象和原来的对象不是同一个对象。对象地址不一样
3) hashCode():由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的)。
2、重写之后:
1) toString()方法一般返回的是:属性的拼接
@Override
public String toString() {
return “Person2 [name=” + name + “, age=” + age + “]”;
}
2) equals()方法:重写之后一般只要自定义为两个对象的所有属性值相等就返回为true;
3) hasdCode():重写hashCode,
@Override
public int hashCode()
{
final int PRIME = 31;
int result = 1;
result = PRIME * result + getId();
return result;
}
-
3、总结
1) 对象相等则hashCode一定相等;
2) hashCode相等对象未必相等。也就是说两个不同的对象也有可能hashCode(散列码(取余得出的))相同
判断两个对象是否相等的条件:
没有重写的话,只要hashCode不相等那么两个对象一定不相同,
重写的话,首先判断hashCode如果不一样,那么两个对象不相等,如果hashCode一样的话,再比较equals,如果true就相同,否则不相等。
推荐阅读
-
Python探索之静态方法和类方法的区别详解
-
jdk基础之Object类getClass()方法
-
jdk基础之Object类hashCode()和equal()方法
-
荐 java父类-Object类-equals与==-方法的重载和重写-游离块-this关键字
-
super和this—游离块—Object类的方法—引用数据类型转换…
-
关于Object类中的wait()和notify()方法实现生产者和消费者模式
-
PAI中的Object类、toString、equals方法
-
Java:object类 中常用equals()和 toString()方法的重写
-
java类中的equals、hashCode和toString方法
-
Object最高父类的方法应用 equals和toString