好,更有意義的比較將
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座標)的對象的事情。
你應該總是使用's1.equals(S2)'用java [見這裏] [1] [1]:http://stackoverflow.com/questions/513832/我怎麼做比較字符串在java中 – mikeb
不,我只是想問爲什麼i1 == i2是真的,而s1 == s2是假的 –
'i1'和'i2'不是引用,它們是原語(因爲的類型'int'和[unboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)),因此具有相同的值。 – sainaen