2015-06-21 54 views
0

我可以知道==是如何工作的嗎?爲什麼「==」對整數和字符串引用的工作方式不同?

public class App { 
    public static void main(String[] args) { 
     String s1 = new String("str"); 
     String s2 = new String("str"); 
     System.err.println("why it,s "+String.valueOf(s1==s2)); 
     int i1 = new Integer(10); 
     int i2 = new Integer(10); 
     System.err.println("why it,s "+String.valueOf(i1==i2)); 
    } 

}

當我比較相同值的兩個不同String引用,然後==說,他們是不相等的,但是當我比較兩個整數的引用擁有相同的值,然後==表示他們是平等的。爲什麼這樣?

+0

你應該總是使用's1.equals(S2)'用java [見這裏] [1] [1]:http://stackoverflow.com/questions/513832/我怎麼做比較字符串在java中 – mikeb

+0

不,我只是想問爲什麼i1 == i2是真的,而s1 == s2是假的 –

+2

'i1'和'i2'不是引用,它們是原語(因爲的類型'int'和[unboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)),因此具有相同的值。 – sainaen

回答

3

好,更有意義的比較將

public class App{ 
public static void main(String[] args) { 
    String s1 = new String("str"); 
    String s2 = new String("str"); 
    System.err.println("why it,s "+String.valueOf(s1==s2)); 
    Integer i1 = new Integer(10); 
    Integer i2 = new Integer(10); 
    System.err.println("why it,s "+String.valueOf(i1==i2)); 
} 
} 

int是原始的,而==將只是比較值。 Integer是一個對象,==對象只有在指向內存中的相同位置時才爲真,否則將爲false。對於基元(int,boolean等)==將測試該值。

int i = Integer(10)真的int i = (Integer(10)).intValue(),JAVA只是它自動的。

編輯,以增加更多的解釋:

Java有2種類型。基元類型和類類型。基本類型只是該類型的值:int基本類型就是這樣,而int。沒有方法或任何東西,它只是一個int。

如果你說int a = 4,一個是指向包含一個int內存地址的原始變量。而已。

A類類型是Java對象,所以整數是一個類類型。它代表一個整數值,所以Integer a = new Integer(4)將創建一個整數對象,並且將指向包含對象,新...創建的存儲位置。

有什麼不同?

好問題。在後面的例子中(新的Integer(4)),這是一個整數和其他一些東西,東西像一個toString()方法和一些其他的東西。

因此,回顧一下:

一種原始存儲在內存中某處的值。 一個類是一個存儲在內存中的對象,在Integer的情況下它表示一個int,但它有一些與它相關的其他東西(即`toString()方法)。

現在,==是一個等效性測試。所以int == int檢查是否基本值是相同的,因爲這是基本類型唯一的信息。

==爲對象意味着什麼。由於對象指向的不只是4或8或-1,因此如果對象變量指向到內存中的相同位置,則==僅返回true。如果沒有,那麼你就會失敗。

所以:

int i = 1; 
int j = 1; 
Integer k = new Integer(1) 
Integer l = new Integer(1) 
Integer m = k; 
Integer n = new Integer(k) 

i == j -> true 
k == l -> false 
k == k -> true 
k == l -> true 
n == m -> false 
n.intValue() == m.intValue() -> true (intValue returns a primitive type) 

現在,.equals是一個測試,看看如果兩個對象是相等的,這意味着對不同的對象不同的事情。

對於整數,如果int和b的intValue()s相同,則a.equals(b)爲true。然而,如果a和b指向內存中的相同對象,則a == b爲真。

現在,關於其中有2個整數(如x,y座標)的對象的事情。

+0

但是,爲什麼System.err.println()方法顯示爲false? –

+0

@ G4uKu3,因爲它們是不同的對象,因此具有不同的參考值。 – sainaen

+0

@ G4uKu3如果我沒有記錯的話,無論何時使用'new',你都可以保證返回一個與JVM中任何其他對象不相等的新對象(使用'==')。 –

相關問題