基礎數據類型有byte、short、char、int、long、float、double、bool、String。除了 String 會比較地址,其它的基礎類型的比較,使用 == 和 equals() 二者都是比較值。java
1 public boolean equals(Object anObject) { 2 if (this == anObject) { //先比較地址,若是相同直接返回true 3 return true; 4 } 5 if (anObject instanceof String) {//若是地址不相同,判斷要比較的對象是否是String實例,若是不是直接返回false 6 String anotherString = (String) anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) {//比較兩個對象的長度,若是不相等直接返回false 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 //比較兩個string對象的每一個字符,若是都相等,就返回true,有一個不相等就返回false 18 return true; 19 } 20 } 21 return false; 22 }
查看源碼可知,String 類型的 equals 方法既會比較地址,也會比較字符串的每一個字符(值).ide
1 public class Main { 2 public static void main(String[] args) { 3 String name1 = new String("123"); 4 String name2 = new String("123"); 5 System.out.println(name1 == name2);//false 6 System.out.println(name1.equals(name2));//true 7 } 8 }
結果分析: name1 和 name2 是 String 的兩個不一樣實例,name1==name2 是比較 name1 與 name2 的地址,因此返回 false。而 name1.equals(name2) 先是比較二者的地址,發現不一樣後接着比較二者的值,相同,因此返回 true。函數
1 public boolean equals(Object obj) { 2 return (this == obj); 3 }
查看源碼可知,當本身定義的類若是不重寫 Object 類中 equals() 方法時,調用 equals() 方法其實和直接用 == 判斷的效果同樣。this
1 public class Person { 2 private String name; 3 4 public Person(String name) { 5 this.setName(name); 6 } 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 }
1 public class Test { 2 public static void main(String[] args) { 3 Person person1 = new Person("zze"); 4 Person person2 = new Person("zze"); 5 System.out.println(person1 == person2);//false 6 System.out.println(person1.equals(person2));//false 7 } 8 }
1 public class Person { 2 private String name; 3 4 public Person(String name) { 5 this.setName(name); 6 } 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 16 @Override 17 public boolean equals(Object obj) { 18 if(obj instanceof Person){ 19 return this.name==((Person) obj).name; 20 } 21 return false; 22 } 23 }
1 public class Test { 2 public static void main(String[] args) { 3 Person person1 = new Person("zze"); 4 Person person2 = new Person("zze"); 5 System.out.println(person1 == person2);//false 6 System.out.println(person1.equals(person2));//true 7 } 8 }
首先,基本數據類型與複合數據類型在內存中存儲的的方式是不一樣的:spa
能夠這樣理解:使用 == 比較的時候都是比較變量中存儲的值,但基礎類型的變量中存儲的值就是實際值,而複合數據類型變量中存儲的值是指向堆對象的引用地址。而 equals() 方法就是一個依賴於 == 實現普通函數,只不過它的實現是在全部對象的基類 (Object) 中.code