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)
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.
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);
//test1跟test2都有新生成一個物件,所以用==地址查詢會是false
//test1.equals(test2),因為沒有改寫equals,所以結果也是false
test1=test2;
//把他們放到同一個記憶體裡了,所以現在test1跟test2兩個標籤指向同一個記憶體(物件),下面都會是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);
//test1跟test2都有新生成一個物件,所以用==地址查詢還是會是false
//test1.equals(test2),因為改寫了equals,所以結果一定是true
test1=test2;
//把他們放到同一個記憶體裡了,所以現在test1跟test2兩個標籤指向同一個記憶體(物件)
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
留言列表