首页 新闻 搜索 专区 学院

求大佬解释一下 == 和 euqals区别 最好带内存分配图

0
[待解决问题]

Students s1 = new Students("张三",20,'男');
Students s2 = new Students("张三",20,'男');
boolean b2 = s1.equals(s2);
System.out.println(b2);

String x1 = new String("Hello");
String x2 = new String("Hello");
boolean a2 = x1.equals(x2);
System.out.println(a2);

class Students{
String name;
int age;
char sex;

public Students(String name,int age,char sex) {
	super();
	this.name=name;
	this.age=age;
	this.sex=sex;
}

}

equals比较对象内容是否相同,我看s1和s2内容一样,x1和x2内容也一样。搞不清楚为什么b2是false而a2是true

柯文昆的主页 柯文昆 | 菜鸟二级 | 园豆:202
提问于:2021-08-02 13:43
< >
分享
所有回答(4)
-1

这个Equals是Object里面的方法,子类可以重写的。不同的类实现有所不同的。


不好意思,以为是C#。不过我猜Java也是一样的。

会长 | 园豆:10273 (专家六级) | 2021-08-02 18:03

不是特别明白,重写以后比较的应该也是内容吧,我看内容也是一样的啊,就是这个点,一直搞不懂,纠结。

支持(0) 反对(0) 柯文昆 | 园豆:202 (菜鸟二级) | 2021-08-02 18:11

@柯文昆: Students类是你自己写的吧,里面的Equals方法你没有重写吧,没有重写就是用的父类(Object)里的逻辑。

支持(0) 反对(1) 会长 | 园豆:10273 (专家六级) | 2021-08-02 19:22

@会长: 明白了,结合楼下大佬的懂了,一直不知道重写这方面。
就是没有重写queals方法的话,就是用父类(Object)的逻辑,这里面的逻辑就是比较对象地址。
应该是这个意思吧。

支持(0) 反对(0) 柯文昆 | 园豆:202 (菜鸟二级) | 2021-08-03 11:57
1

student对象的创建是在堆区中,你new的两个对象在堆区分配的是两个不一样的地址,student类没有重写equals方法默认比较的是对象地址,故为false。下面的string重写了equals方法,比较的是两个string的值,所以为true。用手机回答的,不方便给你画图,抱歉,希望能理解。

Un1verse | 园豆:202 (菜鸟二级) | 2021-08-02 23:22

student类没有重写equals方法默认比较的是对象地址。你一说这个我就明白了。
这句话和楼上大佬说的 “Equals方法没有重写就是用的父类(Object)里的逻辑。”是一个意思吧。
父类(Object)里面的逻辑就是默认比较对象地址吧?

支持(0) 反对(0) 柯文昆 | 园豆:202 (菜鸟二级) | 2021-08-03 11:56
0

这种问题一般疑惑的是 s1!=s2, x1==x2 。。。

字符串 是一种特殊的引用类型,设计的时候做了很多性能优化。我之前写过一篇博客可以参考看下

https://www.cnblogs.com/gt1987/p/13581958.html

gt1987 | 园豆:1095 (小虾三级) | 2021-08-05 10:40

感谢大佬!

支持(0) 反对(0) 柯文昆 | 园豆:202 (菜鸟二级) | 2021-08-07 17:48
0
ycyzharry | 园豆:23926 (高人七级) | 2021-08-06 00:41

感谢大佬!

支持(0) 反对(0) 柯文昆 | 园豆:202 (菜鸟二级) | 2021-08-07 17:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册