equals()方法和“==”的区别(有题目,理解更清楚✌)

public boolean equals(Object obj):该方法是比较两对象封装的数据是否相等;
与“==”不同,后者是比较两个对象的引用是否指向同一对象。

但是,在Object类中,由于Object类是所有类的祖先,站在金字塔的最顶端,它没有封装内容,所以equals()方法采用的是后者比较方法,即比较对象引用。因此,在类设计时,需要进行对象的数据比较,一般要重写equals()方法。

我们先看这一段代码:

String s1 = "HelloWorld";
String s2 = "HelloWorld";

boolean b1 = s1.equals(s2);
boolean b2 = (s1==s2);

结果为b1为true,b2也为true。
有人会问s1和s2是两个对象引用,为什么是true呢?

这是因为字符串常量是不变量,Java在编译时在对待字符串常量的存储时有一个优化处理策略,相同的字符串常量只存储一份,也就是说s1和s2指向的是同一个字符串。

我们再来看这一段代码:

String s1 = "HelloWorld";
String s2 = new String("HelloWorld");

boolean b1 = s1.equals(s2);
boolean b2 = (s1==s2);

结果为b1为true,b2为false。
s1和s2封装的内容一样就不用解释了,在s2 new String(“HelloWorld”)时,将会创建一个新字符串对象,所以b2就为false了。

那再来看这一段代码:

String s1 = new String("HelloWorld");
String s2 = new String("HelloWorld");

boolean b1 = s1.equals(s2);
boolean b2 = (s1==s2);

在这一段代码中,我们需要注意的是:StringBuffer类中没有定义equals方法!
所以在这里,s1.equals(s2)用的是“==”比较,是比较他们两个引用是否相等,显然,他们是不相等的,所以两个结果都为false。

猜你喜欢

转载自blog.csdn.net/xiaobai_qian/article/details/106316087