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
这个Equals
是Object里面的方法,子类可以重写的。不同的类实现有所不同的。
不好意思,以为是C#。不过我猜Java也是一样的。
不是特别明白,重写以后比较的应该也是内容吧,我看内容也是一样的啊,就是这个点,一直搞不懂,纠结。
@柯文昆: Students类是你自己写的吧,里面的Equals方法你没有重写吧,没有重写就是用的父类(Object)里的逻辑。
@会长: 明白了,结合楼下大佬的懂了,一直不知道重写这方面。
就是没有重写queals方法的话,就是用父类(Object)的逻辑,这里面的逻辑就是比较对象地址。
应该是这个意思吧。
student对象的创建是在堆区中,你new的两个对象在堆区分配的是两个不一样的地址,student类没有重写equals方法默认比较的是对象地址,故为false。下面的string重写了equals方法,比较的是两个string的值,所以为true。用手机回答的,不方便给你画图,抱歉,希望能理解。
student类没有重写equals方法默认比较的是对象地址。你一说这个我就明白了。
这句话和楼上大佬说的 “Equals方法没有重写就是用的父类(Object)里的逻辑。”是一个意思吧。
父类(Object)里面的逻辑就是默认比较对象地址吧?
这种问题一般疑惑的是 s1!=s2, x1==x2 。。。
字符串 是一种特殊的引用类型,设计的时候做了很多性能优化。我之前写过一篇博客可以参考看下
感谢大佬!