public boolean equals(Object obj) {
// 为了提高效率:如果两个内存地址相等 , 那么一定是指向同一个对内存中的对象 , 就无需比较两个对象的属性值(自己跟自己比 , 没啥意义嘛)
if (this == obj) {
return true;
// 为了提供程序的健壮性
// 我先判断一下 , obj是不是学生的一个对象 , 如果是 , 再做向下转型 , 如果不是 , 直接返回false 。
// 这个时候 , 我们要判断的是对象是否是某个类的对象?
// 记住一个格式:对象名 instanceof 类名 。 表示:判断该对象是否是该类的一个对象
if (!(obj instanceof Student)) {
return false;
// 如果是就继续
Student s = (Student) obj;
// 强制转换 , 即向下转型(毕竟Object类型没有具体的对象属性)
return this.name.equals(s.name) && this.age == s.age && this.address.equals(s.address);//判断两个对象的属性值是否相等
四、 Java基础不简单 , 谈谈hashCode()和equals()之间的联系重写equals()方法就可以比较两个对象是否相等 , 为什么还要重写hashcode()方法呢?
上述代码中 , 首先判断传递进来的对象与当前对象的地址是否相等 , 如果相等 , 则肯定是同一个堆内存中的对象 。 因为传递进来的参数是Object类型 , 所以任何对象都可以接收 。 一旦接收进来 , 就将Object类型的对象向下转型 , 然后判断具体的属性值 。
因为HashSet、HashMap底层在添加元素时 , 会先判断对象的hashCode是否相等 , 如果hashCode相等才会用equals()方法比较是否相等 。 换句话说 , HashSet和HashMap在判断两个元素是否相等时 , 会先判断hashCode , 如果两个对象的hashCode不同则必定不相等 。
那么有些人看到这里 , 就会问 , 如果两个对象返回的哈希码都是一样的话 , 是不是就一定相等?
答案是不一定的 , 因为HashSet、HashMap判断哈希码相等后还会再用equals()方法判断 。
总而言之:
- 哈希码不相等 , 则两个对象一定不相同 。
- 哈希码相等 , 两个对象不一定相同 。
- 两个对象相同 , 则哈希码和值都一定相等 。
而浅拷贝和深拷贝就是在这个基础之上做的区分 , 如果在拷贝这个对象的时候 , 只对基本数据类型进行了拷贝 , 而对引用数据类型只是进行了引用的传递 , 而没有真实的创建一个新的对象 , 则认为是浅拷贝 。
反之 , 在对引用数据类型进行拷贝的时候 , 创建了一个新的对象 , 并且复制其内的成员变量 , 则认为是深拷贝 。
所以到现在 , 就应该了解了 , 所谓的浅拷贝和深拷贝 , 只是在拷贝对象的时候 , 对 类的实例对象 这种引用数据类型的不同操作而已 。
- 教室|集度完成A轮融资,开扒百度造车到底是香饽饽还是烫手山芋?
- 希捷酷狼|百度云盘正式到来!威联通TS-464C初体验
- 百度网盘|家庭网络折腾笔记 篇十三:手把手教你使用群晖同步 百度网盘&阿里云盘
- R技术专利|以腾讯、百度为首的中国科技公司VR/AR技术专利申请量位居全球前列
- talkingdata|企业和品牌百度百科应该怎么做,创建百度百科的方法和规则
- 百度|百度研究院10大预测锚定科技走势
- 百度|社会信息差极大,商业机会藏在其中
- 高德地图|2021手机地图满意度排名,高德第一,谷歌第五
- 百度|偏门项目,一月收入四五万
- 抖音|2022年红包大战再起:抖音分20亿元、快手多砸1亿元、百度与去年持平