细谈 == 和 equals 的具体区别 【包括equals源码分析】
1.前言
昨天舍友去面试,被面试官的问题难住了:俩个学生类除了学生姓名不同用.equal来比较。
我是一脸懵逼的 ,问题说的很模糊 ,
理解字面意思为 :一个 实体类名叫Student ,内部属性有学生姓名等 ,然后该类被new 了两个对象 ,输入不同的name值 ,然后使用 .equals比较是否相同。
我是怎么想都觉得不可能相等的啊 ,new了不同的对象 ,不论是存在栈还是堆空间的地址都不可能相同的 ,难道使用get方法一个一个值取出来再比较?
这问题简直是脱裤子放屁。
2.操作
实体类Student
package com.example.javabaisc.MyEqual; public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
测试类
package com.example.javabaisc.MyEqual; import org.junit.jupiter.api.Test; public class StuTest { @Test public void t() { Student student = new Student(); student.setAge(18); student.setName("cen"); Student student2 = new Student(); student2.setAge(18); student2.setName("cen"); System.out.println("========equql 比较对象============="); if (student.equals(student2)) { System.out.println("一样"); } else { System.out.println("不一样"); } System.out.println("==========使用 == 比较地址空间===================="); if (student == student2) { System.out.println("一样"); } else { System.out.println("不一样"); } } }
3.测试
启动测试类,打印结构
4.分析
看到打印结果,果然不出我所料,不论是 == 比较还是 equals 比较,结果都是false ,即不等。
为什么?
==号,如果比较的两个 元素是 基本数据类型 ,则直接比较数值 ,如果是引用类型 【也就是对象】,则比较的是一个对象在内存中的地址值【常量放在常量池、对象放在堆里面,都有相应的空间地址】
equals 的情况比较复杂,首先会比较 对象在内存中的地址值 ,如果不相等 ,则继续比较,先判断是不是String类型 ,如果不是则直接返回false ,如果是,则将对象强转String ,
然后将一位一位的字符比较ASCLL码是否相等,如果有一个不等,则直接返回false,如果全部相等,则返回true.
下图为源码:
5.结论
使用equals对比两个对象【指new了两个新的对象,即便类型】,那么地址值必然不同,同时如果对象不是String类型 ,则永远是false。
如果地址值是相同的【任意类型,不仅仅是String类型】,那么使用equals对比,则会是true ,但是不能保证内部的值是相同的。
比如在 哈希表的比较中 ,使用equals对比 哈希值 ,如果哈希值相同,则地址必然相同,但是该地址存储的对象则不一定相同【即便对象相同,但是值也不一定相同】。
本文来自博客园,作者:岑惜,转载请注明原文链接:https://www.cnblogs.com/c2g5201314/p/13113760.html
响应开源精神相互学习,内容良币驱除劣币