细谈 == 和 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对比 哈希值 ,如果哈希值相同,则地址必然相同,但是该地址存储的对象则不一定相同【即便对象相同,但是值也不一定相同】。
最新文章
- 更改Visual Studio 2015 默认的语言设置
- windows+caffe(五)——实例2MNIST图片
- Displaying Bitmaps Efficiently 显示图片相关
- opendove中的odgw所需要的内核模块
- python目前最好用的IDE——pycharm
- library not found for -lPods 的解决办法
- C++ note
- win7系统中更新错误怎么解决的方法
- 关于PCB布线的顺序到底是怎样才合理?
- 用JavaScript(js)对时间格式化
- request对象
- iOS 多线程学习笔记 —— NSThread
- JavaScript可否多线程? 深入理解JavaScript定时机制(转载)
- RAW模板命名规范
- 在Service服务中请求网络
- Python+Tkinter 密保小工具
- numpy(三)
- Redux 和 React-Redux简介
- [JS] JS Basic : compare with c#
- cyclone IV中DDR的一个报错{Too many output and bidirectional pins per VCCIO and ground pair in I/O bank 8 }
热门文章
- Properties类继承HashTable类,一般用来给程序配置属性文件。
- 计算机网络 Raw_Socket编程 Ping C语言
- Sql Server、Oracle、MySQL 日期格式化函数处理
- WebSocket协议理解-数据包格式解析
- Json解析案例-teachers数据集
- JAVA使用IDEA本地调试服务的代码
- 【LeetCode】621. Task Scheduler 解题报告(Python & C++)
- Interesting Fibonacci(hdu 2814)
- codeforces 624C Graph and String
- 关于python常用的命令