在Java中,我們比較兩個物件時有兩種方法,一種是直接使用邏輯運算子==號,還有一種就是用equlas()函式,該函式在Object中就定義了,所以每個類都會有這個函式,好了現在我們看看普通物件和字串在使用這兩種比較方式有什麼不同,看下面程式碼,讀者可以猜猜看結果是什麼:
public class Equals {
/**
* @param args
*/
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
Object o3 = o1;
Object o4 = o2;
* @param args
*/
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
Object o3 = o1;
Object o4 = o2;
System.out.println( “o1.equals( o1 ): ” + o1.equals( o1 ) );
System.out.println( “o1.equals( o2 ): ” + o1.equals( o2 ) );
System.out.println( “o1.equals( o3 ): ” + o1.equals( o3 ) );
System.out.println( “o1.equals( o4 )” + o1.equals( o4 ) );
System.out.println();
System.out.println( “o1.equals( o2 ): ” + o1.equals( o2 ) );
System.out.println( “o1.equals( o3 ): ” + o1.equals( o3 ) );
System.out.println( “o1.equals( o4 )” + o1.equals( o4 ) );
System.out.println();
System.out.println( “o1 == o1: ” + ( o1 == o1 ) );
System.out.println( “o1 == o2: ” + ( o1 == o2 ) );
System.out.println( “o1 == o3: ” + ( o1 == o3 ) );
System.out.println( “o1 == o4: ” + ( o1 == o4 ) );
System.out.println( “o1 == o2: ” + ( o1 == o2 ) );
System.out.println( “o1 == o3: ” + ( o1 == o3 ) );
System.out.println( “o1 == o4: ” + ( o1 == o4 ) );
System.out.println();
String s1 = new String( “abc” );
String s2 = new String( “abc” );
String s3 = new String( “def” );
String s4 = s1;
String s5 = s2;
String s6 = s3;
String s2 = new String( “abc” );
String s3 = new String( “def” );
String s4 = s1;
String s5 = s2;
String s6 = s3;
System.out.println( “s1.equals( s1 ): ” + s1.equals( s1 ) );
System.out.println( “s1.equals( s2 ): ” + s1.equals( s2 ) );
System.out.println( “s1.equals( s3 ): ” + s1.equals( s3 ) );
System.out.println( “s1.equals( s4 ): ” + s1.equals( s4 ) );
System.out.println( “s1.equals( s5 ): ” + s1.equals( s5 ) );
System.out.println( “s1.equals( s6 ): ” + s1.equals( s6 ) );
System.out.println( “s1.equals( s2 ): ” + s1.equals( s2 ) );
System.out.println( “s1.equals( s3 ): ” + s1.equals( s3 ) );
System.out.println( “s1.equals( s4 ): ” + s1.equals( s4 ) );
System.out.println( “s1.equals( s5 ): ” + s1.equals( s5 ) );
System.out.println( “s1.equals( s6 ): ” + s1.equals( s6 ) );
System.out.println();
System.out.println( “s1 == s1: ” + ( s1 == s1 ) );
System.out.println( “s1 == s2: ” + ( s1 == s2 ) );
System.out.println( “s1 == s3: ” + ( s1 == s3 ) );
System.out.println( “s1 == s4: ” + ( s1 == s4 ) );
System.out.println( “s1 == s5: ” + ( s1 == s5 ) );
System.out.println( “s1 == s6: ” + ( s1 == s6 ) );
}
System.out.println( “s1 == s2: ” + ( s1 == s2 ) );
System.out.println( “s1 == s3: ” + ( s1 == s3 ) );
System.out.println( “s1 == s4: ” + ( s1 == s4 ) );
System.out.println( “s1 == s5: ” + ( s1 == s5 ) );
System.out.println( “s1 == s6: ” + ( s1 == s6 ) );
}
}
有沒有答案了,如果有了,看看你的答案正確嗎,
o1.equals( o1 ): true
o1.equals( o2 ): false
o1.equals( o3 ): true
o1.equals( o4 )false
o1.equals( o2 ): false
o1.equals( o3 ): true
o1.equals( o4 )false
o1 == o1: true
o1 == o2: false
o1 == o3: true
o1 == o4: false
o1 == o2: false
o1 == o3: true
o1 == o4: false
s1.equals( s1 ): true
s1.equals( s2 ): true
s1.equals( s3 ): false
s1.equals( s4 ): true
s1.equals( s5 ): true
s1.equals( s6 ): false
s1.equals( s2 ): true
s1.equals( s3 ): false
s1.equals( s4 ): true
s1.equals( s5 ): true
s1.equals( s6 ): false
s1 == s1: true
s1 == s2: false
s1 == s3: false
s1 == s4: true
s1 == s5: false
s1 == s6: false
s1 == s2: false
s1 == s3: false
s1 == s4: true
s1 == s5: false
s1 == s6: false
為什麼會出現上面的結果呢,其實在Java中,邏輯運算子==號在比較物件的時候是嚴格的比較這兩個物件是不是同一個物件,說白了,它比較的是兩個物件在記憶體中的地址,只有當兩個變數指向同一個記憶體地址即同一個物件時才返回true,否則返回false,所以就可以看到當我們用new方法建立了o1和o2由於分配了兩個不同的記憶體空間,所以它們在用邏輯運算子==號來判斷兩個物件是否相等時自然應該返回的是false,而在比較o1和o3時,由於o3指向的實際是o1所指向的地址,所以返回true,在字串中邏輯運算子==的作用和普通物件是一樣的。
那麼對於o1和o2用equals()方法比較返回的為什麼也是false呢,我們來看一段程式碼:
public boolean equals( Object o2 )
{
this == o2;
}
這是Object中equals()函式的實現,可以看到實際上它的功能還是比較兩個物件的地址,自然你現在可以推出為什麼o1和o2比較時還是返回false了。
那現在問題可能來了,那為什麼s1和s2比較時返回的是true呢,他們在記憶體空間的地址可是不一樣的啊,呵呵,其實這個理解起來更簡單了,因為在String類中過載了equals()函式,使它比較的是兩個字串的內容,而不是兩個字串物件在記憶體中的地址,至於如何寫這個函式我就不多說了,大家可以自己寫寫看,實現方式有多種,不過Sun公司當然只有那一種實現方式,哈哈