java中equals()和==的區別

java中的數據類型

基礎數據類型

基礎數據類型有byte、short、char、int、long、float、double、bool、String。除了 String 會比較地址,其它的基礎類型的比較,使用 == 和 equals() 二者都是比較值。java

  • String類的equals()方法源碼

     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

  • String類型的equals()比較

    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。函數

複合數據類型(類)

  • Object類中equals()方法源碼

    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 }
    Person.java
    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 }
    Person.java
    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

相關文章
相關標籤/搜索