Java中 == 和 equlas() 的區別
阿新 • • 發佈:2019-01-26
“==” 用來比較兩個變數的值是否相等。具體而言:
>>如果兩個變數是基本資料型別,使用“==”來比較其對應的值是否相等。
>>如果變數指向的資料是物件,那麼用“==”可以比較這兩個物件是否指向同一個物件。(但是不能比較兩個物件的內容是否相等)
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=
true:同上,equals比較的是 intValue。
第二題的答案是:
false :s1和s2引用物件不同。
true:s1和s2的值相同。
true:s1和s3的值相同。
true :s2和s3引用物件相同。
false:當呼叫 intern 方法時,如果池已經包含一個等於此 String 物件的字串(該物件由 equals(Object) 方法確定),則返回池中的字串。否則,將此
String 物件新增到池中,並且返回此 String 物件的引用。
true:同上。