当前位置:网站首页>“==”和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就一定比较的是值或者地址,要看是否有重写,如果没有重写就是地址,重写了也不见得就是值,还需要看我们重写的规则是什么。
边栏推荐
猜你喜欢
随机推荐
如何在安装GBase 8c数据库的时候,报错显示“Host ips belong to different cluster?
推荐系统-排序层-特征工程:用户特征、物品特征
【OpenCV】 - 显示图像API之imshow()对不同位深度(数据类型)的图像的处理方法
VR全景市场拓展技巧之“拓客宝典”
训练正常&异常的GAN损失函数loss变化应该是怎么样的
Evaluate: A detailed introduction to the introduction of huggingface evaluation indicator module
xshell开启ssh端口转发,通过公网机器访问内网机器
MySQL or使索引失效
剑指offer专项突击版第18天
用diskpart的offline命令弹出顽固硬盘
The use of the database table structure document generation tool screw
学习Glide 常用场景的写法 +
标准输入流
Taro框架-微信小程序-内嵌h5页面
控制bean的加载
Detailed explanation of cause and effect diagram of test case design method
最佳高质量字体
sqlite 日期字段加一天
解决移动端有纵向滚动条但是不能滚动的问题
information_schema







