1. 程式人生 > >Java中 == 和 equlas() 的區別

Java中 == 和 equlas() 的區別

“==” 用來比較兩個變數的值是否相等。具體而言:

>>如果兩個變數是基本資料型別,使用“==”來比較其對應的值是否相等。

>>如果變數指向的資料是物件,那麼用“==”可以比較這兩個物件是否指向同一個物件。(但是不能比較兩個物件的內容是否相等)

equals是Obeject類中的方法,沒有覆蓋過的equals方法會直接使用“==”比較兩個物件的引用是否相等。

但當equals被覆蓋,就可以讓它比較物件的內容是否相等,比如string物件。

看一下Java中String物件到底是如何覆寫equals()方法的:

public boolean equals(Object anObject) {
        if (this == anObject) {  //引用相等,指向的同一個物件,肯定是相等的。
            return true;
        }
        if (anObject instanceof String) {  //判斷是否是String型別
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {  //判斷字串的長度是否相等
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {  //轉化為char字串,然後挨個判斷值是否相等
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }


下面就是這類問題常考的經典題目了:

1、下面這段程式碼的輸出是什麼?

public class EQUals {

	public static void main(String[] args) {
	
		Integer i1=127,i2=127,i3=128,i4=128;
		System.out.println(i1==i2);
		System.out.println(i1.equals(i2));
		System.out.println(i3==i4);
		System.out.println(i3.equals(i4));

	}

}


2、下面這段程式碼的輸出是什麼?

public class EQUals {

	public static void main(String[] args) {

		String s1="Hello";
		String s2=new String("Hello");
		String s3=s2;
		String s4=s3.intern();
		System.out.println(s1==s2);
		System.out.println(s1.equals(s2));
		System.out.println(s1.equals(s3));
		System.out.println(s2==s3);
		System.out.println(s3==s4);
		System.out.println(s3.equals(s4));
	}

}


解析:

第一題的答案是:

true:基本型別是判斷值相等。
true:Integer的euqlas方法是直接呼叫 ==的:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }


false:JVM會自動維護八種基本型別的常量池,int常量池中初始化-128~127的範圍,所以當為Integer i=127時,在自動裝箱過程中是取自常量池中的數值,而當Integer i=
128時,128不在常量池範圍內,所以在自動裝箱過程中需new 128,所以地址不一樣

true:同上,equals比較的是 intValue。

第二題的答案是:

false :s1和s2引用物件不同。
true:s1和s2的值相同。
true:s1和s3的值相同。
true :s2和s3引用物件相同。
false當呼叫 intern 方法時,如果池已經包含一個等於此 String 物件的字串(該物件由 equals(Object) 方法確定),則返回池中的字串。否則,將此 String 物件新增到池中,並且返回此 String 物件的引用。
true:同上。