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()方法判断 。
总而言之:
- 哈希码不相等 , 则两个对象一定不相同 。
- 哈希码相等 , 两个对象不一定相同 。
- 两个对象相同 , 则哈希码和值都一定相等 。
而浅拷贝和深拷贝就是在这个基础之上做的区分 , 如果在拷贝这个对象的时候 , 只对基本数据类型进行了拷贝 , 而对引用数据类型只是进行了引用的传递 , 而没有真实的创建一个新的对象 , 则认为是浅拷贝 。
反之 , 在对引用数据类型进行拷贝的时候 , 创建了一个新的对象 , 并且复制其内的成员变量 , 则认为是深拷贝 。
所以到现在 , 就应该了解了 , 所谓的浅拷贝和深拷贝 , 只是在拷贝对象的时候 , 对 类的实例对象 这种引用数据类型的不同操作而已 。
- Java|vivo携手新华社,发起“寻找中国之美”互动活动
- Java|更舒适的运动蓝牙耳机,Skullcandy运动豆上手体验:真香
- 云安全|为什么Android开发使用Java而不是C语言?
- 飞利浦·斯塔克|Java培训:在Java应用程序中测试微服务
- Java|元宇宙 群雄并起,Coinbase进军NFT领域
- Java|美国服务器设置禁PING的方法步骤
- Java|千元级暂无对手,自适应降噪真无线,cleer轻奢蓝牙耳机试用
- Java|除了做好手机体验之外,魅族这一点真的令人点赞
- Java|RTX3050TI Latap 性能评测,距离RTX3060的差距究竟有多大?
- 网易|Java培训:java开发人员常用的 Java 跟踪工具