当前位置:网站首页>“==”和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就一定比较的是值或者地址,要看是否有重写,如果没有重写就是地址,重写了也不见得就是值,还需要看我们重写的规则是什么。
边栏推荐
- ArcEngine(一)加载矢量数据
- mysql的innodb存储引擎和myisam存储引擎的区别
- MySQL or使索引失效
- 解决GANs训练中模式崩塌/训练崩溃的十五个方法
- 如何像用自来水一样使用数据库?|腾讯云数据库TDSQL-C
- mysql5.7服务器The innodb_system data file 'ibdata1' must be writable导致无法启动服务器
- AI mid-stage sequence labeling task: three data set construction process records
- pyspark---encode the suuid interval (based on the number of exposures and clicks)
- 解决移动端有纵向滚动条但是不能滚动的问题
- drop database出现1010
猜你喜欢
随机推荐
VR全景市场拓展技巧之“拓客宝典”
WordPress主题-B2美化通用子主题商业运营版
vs 2022无法安装 vc_runtimeMinmum_x86错误
tolower函数
Fortify白盒神器20.1.1下载及安装(非百度网盘)
wordpress: 裁剪您的图片时发生错误
Roson的Qt之旅#106 QML在图片上方放置按钮并实现点击按钮切换图片
Mysql如何对两张表的相同字段,同时查询两张数据表
解决移动端有纵向滚动条但是不能滚动的问题
ArcEngine (2) loading the map document
SSM整合流程
mysql5.7服务器The innodb_system data file 'ibdata1' must be writable导致无法启动服务器
Detailed explanation of cause and effect diagram of test case design method
HCIP笔记整理 2022/7/18
推荐系统-排序层-特征工程:用户特征、物品特征
千万级别的表分页查询非常慢,怎么办?
PMP每日一练 | 考试不迷路-8.2(包含敏捷+多选)
22-08-02 西安 尚医通(02)Vscode、ES6、nodejs、npm、Bable转码器
分治法求解中位数
@Async注解的坑,小心