当前位置:网站首页>“==”和equals的区别
“==”和equals的区别
2022-08-03 07:41:00 【Fluoxetine_Zero】
public class Test{
public static void main(String[] args){
int a = 5;
int b = 5;
System.out.println(a == b);
Student stu1 = new Student("张三");
Student stu2 = new Student("张三");
System.out.println(stu1 == stu2);
}
}
上述代码中 a 和 b 分别代表着两个变量,相当于在栈内存中开辟了两个变量空间一个叫a,一个叫b,如下图。其中这个5它是常量,所以常量它存在常量区里面。在常量区里面有个5,而且这个5不是我们书写的5,它是由32位二进制组合的二进制的5。所以相当于把这个5分别复制了一份放到了a和b中。
接下来看这个Student,因为stu1和stu2“=”左边这两个也叫变量,所以两个变量同样也存在栈内存空间里。但是“=”右边的new它会在堆内存里产生空间,所以new的Student它在堆里生成两个对象空间。而这个对象是根据书写的Student类文件会在内存当中先加载一个类模版在方法区里,然后照着这个方法区的模版去new两个空间,就是两个对象。然后对象中我们存了两个值,这两个值叫“张三”,这两个是一样的。但是引用存的是地址,而基本类型存的是值,所以像stu2,stu1里面存的并不是数字,它存的是一个地址,这里用引用1和引用2代替。
接下来我们看“ == ”号比的是什么,所谓的“ == ”号都是变量名去调的,所以相当于是把名字里面的东西拿出来,所以 “ == ” 就是比较变量里边的内容。
那么我们把下图中a和b里面的内容拿出来做比较,明显内容是一样的。
而stu1和stu2内容拿出来一比较,一个是引用1,一个是引用2,内容明显是不一样的。这样也就能直观的看出用“ == ”号做比较哪个是true哪个是false。
而基本类型它是不能调方法的,但是这个Student是可以调方法的,所以可以这么写
public class Test{
public static void main(String[] args){
int a = 5;
int b = 5;
System.out.println(a == b);
Student stu1 = new Student("张三");
Student stu2 = new Student("张三");
System.out.println(stu1 == stu2);
System.out.println(stu1.equals(stu2));
}
}
而这个equals相当于改变了一种比较规则。而它默认情况下在Object类下定义的,而这个类是每一个引用类型的父类,所以这个方法所有的对象都能调用。而因为所有对象都能调用这个方法,这里就涉及到不同的对象的规则不一样,所以他只提供了一个默认的比较规则,就是“==”比较
所以也就是说如果我们没有做任何的说明,我们即便是调了equals方法,他默认的代码里面写的也是“ == ”,所以就算我们正常调的话equals和 “ == ” 是一样的,都是false。
但是我们可以在当前自己描述的类中去重写一个equals,相当于去改变他的规则比的是对象中的内容。比如重写student里面的equals,按照学生的姓名来比较,如果两个人同名那么返回就是true。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student that = (Student) o;
return Objects.equals(stuName, that.stuName);
}
总结:不是说equals就一定比较的是值或者地址,要看是否有重写,如果没有重写就是地址,重写了也不见得就是值,还需要看我们重写的规则是什么。
边栏推荐
- 五、《图解HTTP》报文首部和HTTP缓存
- ArcEngine(四)MapControl_OnMouseDown的使用
- Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
- volta管理node版本
- 【OpenCV】 - 显示图像API之imshow()对不同位深度(数据类型)的图像的处理方法
- JS函数获取本月的第一天和最后一天
- Postman will return to results generated CSV file to the local interface
- 【图像边缘检测】基于matlab灰度图像的积累加权边缘检测【含Matlab源码 2010期】
- 戳Web3的神话?戳到铁板。
- 22-08-02 西安 尚医通(02)Vscode、ES6、nodejs、npm、Bable转码器
猜你喜欢
随机推荐
mysql存生僻字奇怪问题,mysql为什么不能辨别mb4字符?
ArcEngine(六)用tool工具实现拉框放大缩小和平移
Pop Harmony Basics Big Notes
The ORB - SLAM2 extracting feature points
Charles抓包工具学习记录
sqlserver2019安装失败
差分(前缀和的逆运算)
如何像用自来水一样使用数据库?|腾讯云数据库TDSQL-C
ArcEngine (six) use the tool tool to realize the zoom in, zoom out and translation of the pull box
WordPress主题-B2美化通用子主题商业运营版
AI mid-stage sequence labeling task: three data set construction process records
boot-SSE
请求与响应:响应
STL迭代器
ORB-SLAM2提取特征点
五、《图解HTTP》报文首部和HTTP缓存
工控机防勒索病毒浅析
面试介绍项目经验(转)
Daily practice of PMP | Do not get lost in the exam-8.2 (including agility + multiple choice)
ArcEngine(一)加载矢量数据