java中有兩個用來判斷是否相等的語法,一個是==另一個就是equals。

其中「a==b」並不是判斷a跟b的內容是否相同,而是判斷他們是否是指向同一個物件,或說同一塊記憶體。

至於equals請參考此篇:http://openhome.cc/Gossip/JavaEssence/ObjectEquality.html

通常用==會呈現false、用equals會呈現true是因為那個equals在java預設中本來就有改寫了(例如String的equals),但若要使用在自己創在的類別中,則須自己改寫

去看API文件,會發現String中的equals是有override過的,如下(下面是String中equals方法介紹的擷取片段):

public boolean equals(Object anObject)
Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.
Overrides:
equals in class Object

 

Object中的equals定義:

public boolean equals(Object obj) {
    return (this == obj);
}

(其中this就是「a.equals(b)」中的a)


package tw.xxx.xxx.copy.oop;

 

class reWriteEquals{

先空著,之後改寫

}

 

public class CallTestEqualsEx1 {

   public static void main(String[] args) {

      reWriteEquals test1 = new reWriteEquals();

      reWriteEquals test2 = new reWriteEquals();

      System.out.println("==測試:"+(test1==test2)+"地址:"+test1);

      System.out.println("equals測試:"+test1.equals(test2)+"地址:"+test2);

      //test1test2都有新生成一個物件,所以用==地址查詢會是false

      //test1.equals(test2),因為沒有改寫equals,所以結果也是false

     

      test1=test2;

      //把他們放到同一個記憶體裡了,所以現在test1test2兩個標籤指向同一個記憶體(物件),下面都會是true

      System.out.println("共用記憶體後用==測試:"+(test1==test2)+"地址:"+test1);

      System.out.println("共用記憶體後用equals測試:"+test1.equals(test2)+"地址:"+test2);

   }

}


用==測試:false地址:tw.xxx.xxx.copy.oop.reWriteEquals@139a55←test1的地址
用equals測試:false地址:tw.xxx.xxx.copy.oop.reWriteEquals@1db9742←test2的地址
共用記憶體後用==測試:true地址:tw.xxx.xxx.copy.oop.reWriteEquals@1db9742
共用記憶體後用equals測試:true地址:tw.xxx.xxx.copy.oop.reWriteEquals@1db9742

可以發現 test1=test2;後就共用teat2的地址了



package tw.xxx.xxx.copy.oop;

 

class reWriteEquals{

  

   @Override//equals的方法改寫(覆載)

   public boolean equals(Object obj){

      return true;//不論怎麼輸入都會是true

   }

}

 

public class CallTestEqualsEx1 {

 

   public static void main(String[] args) {

      reWriteEquals test1 = new reWriteEquals();

      reWriteEquals test2 = new reWriteEquals();

      System.out.println("==測試:"+(test1==test2)+"test1地址:"+test1);

      System.out.println("equals測試:"+test1.equals(test2)+"test2地址:"+test2);

      //test1test2都有新生成一個物件,所以用==地址查詢還是會是false

      //test1.equals(test2),因為改寫了equals,所以結果一定是true

     

      test1=test2;

      //把他們放到同一個記憶體裡了,所以現在test1test2兩個標籤指向同一個記憶體(物件)

      System.out.println("共用記憶體後用==測試:"+(test1==test2)+"地址:"+test1);

      System.out.println("共用記憶體後用equals測試:"+test1.equals(test2)+"地址:"+test2);

     

 

   }

 

}


用==測試:false地址:tw.xxx.xxx.copy.oop.reWriteEquals@139a55
用equals測試:true地址:tw.xxx.xxx.copy.oop.reWriteEquals@1db9742
共用記憶體後用==測試:true地址:tw.xxx.xxx.copy.oop.reWriteEquals@1db9742
共用記憶體後用equals測試:true地址:tw.xxx.xxx.copy.oop.reWriteEquals@1db9742



字串的儲存方式可以參考這篇:http://yhhuang1966.blogspot.tw/2014/03/java.html

package tw.xxx.xxx.copy.oop;

 

public class CallTestEqualsEx2 {

 

   public static void main(String[] args) {

      String str1= "hello";           //這種宣告方式會把str1的內容存到字串池裡

      String str2 = new String("hello");//這種有new的則會發配一塊記憶體給str2

      String str3 = new String("Hello");//同上

     

      System.out.println("str1==str2的結果:"+(str1==str2));

      System.out.println("str2==str3的結果:"+(str2==str3));//這兩個都會是false,因為記憶體位置不同

     

      System.out.println("str1.equals(str2)的結果:"+(str1.equals(str2)));//答案是true,因為內容相同

      //注意字串的equals方法java內定中覆寫過object的,所以才能直接看內容是否相等

     

      System.out.println("str1.equals(str3)的結果:"+(str1.equalsIgnoreCase(str3)));

      //不會在意大小寫差異的語法

   }

}


str1==str2的結果:false
str2==str3的結果:false
str1.equals(str2)的結果:true
str1.equals(str3)的結果:true
 

arrow
arrow
    全站熱搜

    乙方 發表在 痞客邦 留言(0) 人氣()