一、三个例子
1.==和equals用于String对象的比较
- 代码
public static void main(String[] args) {
String s = new String("abc");
String s1 = new String("abc");
System.out.println(s == s1);
System.out.println(s.equals(s1));
}
- 输出:
- 这很容易解释嘛,因为我们都知道
==
比较的是地址,equals
比较的是字符串内容
2.==和equals用于Object对象的比较
- 代码
public static void main(String[] args) {
Object s = new Object();
Object s1 = new Object();
System.out.println(s == s1);
System.out.println(s.equals(s1));
}
-
结果
-
第一个是
false
还可以理解,为什么第二个也是false
,这两个内容不是相同吗?后面会详细分解
3.==和equals用于自定义对象的比较
- 代码
public static void main(String[] args) {
Person s = new Person("xpt");
Person s1 = new Person("xpt");
System.out.println(s == s1);
System.out.println(s.equals(s1));
}
class Person{
String name;
public Person(String name){
this.name = name;
}
}
-
结果
-
第二个居然也是
false
,这两个对象的内容是完全一致的啊
二、 ==和equals的本质区别
1.==比较的永远是地址
2.equals本质上也比较的是地址,但是有些类重写了equals方法,达到比较对象内容的目的
3.分析
- 因为
Object
类是所有类的父类,我们先观察它的源码
- 很清楚的可以看到,这里的
equals
调用的就是==
,所以这里可以认为equals
本质上也是比较地址 - 下面我们看
String
类的源码
- 这也很清楚的说明问题了,
String
类的equals
是因为被重写成了比较两个字符串的内容是否相等 - 那么这也就可以解释上面第三个例子中,两个自定义对象内容相同,但是调用
equals
比较时却返回的是false
了,因为没有重写equals
方法,那么在调用equals
方法的时候本质上是在调用父类Object
的equals
,而我们通过源码发现Object
的equals
方法比较的就是两个对象的地址 - 那么可以模仿
String
类,来重写自定义类的equals
方法,达到按我们的目的就行比较
public static void main(String[] args) {
Person s = new Person("xpt");
Person s1 = new Person("xpt");
System.out.println(s == s1);
System.out