equals和hashcode

Object类:所有类的祖先,其余类均为Object的子类,Java中的任何对象一定是Object类的对象。
其他都都直接或间接继承了Object类。
Object类中的方法
1、toString方法
源码:
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
备注:
getClass():返回的是一个Class类的对象,Class类:任何一个.class文件都是Class类的一个对象。
getName():Class类的方法,获取一个类的全类名(包名.类名),例如:java.lang.String
测试:打印Student对象(默认调用toString方法),结果:com.test01.Student@1b6d3586
此结果输出的信息,没有任何价值。我们需要重写该方法。
重写的目标:输出该对象的属性值。
注意:一般用于测试,测试成功后,可以不必重写toString方法

2、hashCode()方法:
源码:public native int hashCode();
作用:返回一个对象的哈希值,备注:在Java中,不同的对象的hashCode值(和内存地址相关)要求不同。
toHexString():Integer类的方法,将一个int类型的整数转换为十六进制的字符串。
(1)为何重写hashCode方法,原因?
Student student1 = new Student(101101, “郭伟”, ‘男’, 18);
Student student2 = new Student(101101, “郭伟”, ‘男’, 18);
在Java中认为,student1和student2是不同的对象,在现实中,其实是同一个对象。
所以必须保证,student1和student2的hashCode值相同,我们必须重写hashCode方法。
(2)若两个对象的hashCode值相同,就一定是同一个对象吗?
两个对象的hashCode值相同,不一定是相同对象;此时我们借助equals方法(重写的)进一步判断。
两个对象的hashCode值不相,一定不是相同对象。

3、 equals方法
源码
public boolean equals(Object obj) {
return (this == obj);
}
为什么要重写equals方法?
两个对象的hashCode值相同,不一定是相同对象,此时我们还需进一步判断,
没有重写的equals方法(继承自Object类的equals方法),该方法判断两个对象的地址,无法满足。
重写后的equals方法,比较两个对象的所有属性值。

为什么判断两个对象时,不只用equals方法,而是用hashCode和equals方法?
若只用equals方法,效率太低。借用hashCode方法,当hashCode值不相同,肯定不是同一个对象。

当HashSet集合、HashMap集合中存放自定义对象,底层默认会调用hashCode和equals方法。

4、clone方法
克隆对象:
(1)实现Cloneable接口(没有抽象方法的接口:标记接口)
(2)重写Object类的clone()方法
(3)使用原对象调用clone方法,可以克隆一个新的对象,克隆的对象和原对象互不影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值