1、首先看一下代码:
1 String s1 = new String("abc"); 2 String s2 = new String("abc"); 3 System.out.println(s1 == s2); 4 System.out.println(s1.equals(s2)); 5 6 System.out.println("------------------------------"); 7 8 Person p1 = new Person(); 9 Person p2 = new Person(); 10 System.out.println(p1 == p2); 11 System.out.println(p1.equals(p2));
结果分析:
1、false
2、true
-----------------------------
3、false
4、false
第1个是false的原因是因为使用的是==比较的引用类型
第2个结果是true的原因是因为String的源码中进行了equals的重写,源码如下:
1 public boolean equals(Object anObject) { 2 if (this == anObject) { 3 return true; 4 } 5 if (anObject instanceof String) { 6 String anotherString = (String)anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) { 9 char v1[] = value; 10 char v2[] = anotherString.value; 11 int i = 0; 12 while (n-- != 0) { 13 if (v1[i] != v2[i]) 14 return false; 15 i++; 16 } 17 return true; 18 } 19 } 20 return false; 21 }
3、第3个结果为false的原因是因为使用==判断的引用类型的对象
4、第4个为false的原因是因为Person类中没有重写equals方法,直接继承的父类Object的equals,即就是==的方法源码如下:
1 public boolean equals(Object obj) { return (this == obj); }
1 、== 既可以比较基本类型又可以比较引用类型
1.1 基本类型 比较的是值是否相等
1.2 引用类型 比较的是内存地址是否相等 使用 == 比较引用类型的时候,永远是false
2 、equals 是比较什么?
2.1 equals是Object里面的方法
2.2 只能比较引用类型
2.3 equals到底比较什么?答案是不一定,需要看你是如何重写的
2.3.1 没有重写保持出厂默认,equals就是 ==
2.3.2 具体情况具体分析,看重写的规则