当前位置:网站首页>“==”和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就一定比较的是值或者地址,要看是否有重写,如果没有重写就是地址,重写了也不见得就是值,还需要看我们重写的规则是什么。
边栏推荐
- 如何像用自来水一样使用数据库?|腾讯云数据库TDSQL-C
- ArcEngine (six) use the tool tool to realize the zoom in, zoom out and translation of the pull box
- sqlite 日期字段加一天
- mysql备份时的快照原理
- Roson的Qt之旅#104 QML Image控件
- “碳中和”愿景下,什么样的数据中心才是我们需要的?
- Shell运维开发基础(一)
- 实时目标检测新高地之#YOLOv7#更快更强的目标检测器
- 智能客服,还有多少AI泡沫?
- 使用pipreqs导出项目所需的requirements.txt(而非整个环境)
猜你喜欢

Evaluate: A detailed introduction to the introduction of huggingface evaluation indicator module

2022用户画像构建

训练正常&异常的GAN损失函数loss变化应该是怎么样的

【云原生--Kubernetes】Pod重启策略

Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例

【云原生--Kubernetes】kubectl命令详解

sqlite 日期字段加一天

vs 2022无法安装 vc_runtimeMinmum_x86错误

【第1天】SQL快速入门-基础查询(SQL 小虚竹)

volta管理node版本
随机推荐
升级
mysql存生僻字奇怪问题,mysql为什么不能辨别mb4字符?
【多线程进阶】--- 常见锁策略,CAS,synchronized底层工作原理,JUC,线程安全的集合类,死锁
[ 漏洞复现篇 ] yapi 代码执行 getshell 漏洞复现详解
面试介绍项目经验(转)
用diskpart的offline命令弹出顽固硬盘
流行和声基础大笔记
consul理解
The ORB - SLAM2 extracting feature points
Karatsuba大数乘法的Verilog实现
mysql的innodb存储引擎和myisam存储引擎的区别
Roson的Qt之旅#104 QML Image控件
ArcEngine (1) Loading vector data
HCIP笔记整理 2022/7/20
“唯一索引允许为空“ 的说法是不严谨的
戳Web3的神话?戳到铁板。
【第1天】SQL快速入门-基础查询(SQL 小虚竹)
AI中台序列标注任务:三个数据集构造过程记录
ArcEngine(五)用ICommand接口实现放大缩小
【Kaggle实战】泰坦尼克号生存人数预测(从零到提交到Kaggle再到模型的保存与恢复)