2010-01-07 36 views
15

Bu soruya bugün sordum.Kutulu Primitifler ve Eşdeğerlik

Integer a = 3; 
Integer b = 2; 
Integer c = 5; 
Integer d = a + b; 
System.out.println(c == d); 

Bu program ne çıktı? Doğru döner. Otomatik (ve otomatik un) boksu nasıl anladığımdan dolayı her zaman yanlış yazdıracağım cevabını verdim. Tamsayı a = 3 atamanın yeni bir Tamsayı (3) yaratacağı izlenimi aldım. Böylece bir == referansı ilkel değerden ziyade değerlendirecektir.

Bunu açıklayan var mı?

+0

http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha –

+0

Ancak, http un olası kopyası : //stackoverflow.com/questions/1700081/why-does-128-128-return-false-but-127-127-return-true-when-converting-to-integ daha uygun, bir önceki yanlıştı. Ama belki de ikisi de yanlıştır ;-) –

cevap

20

Kutulu değerler -128 ila 127 arasında önbelleğe alınır. Boks, önbelleği kullanan Integer.valueOf yöntemini kullanır. Aralığın dışındaki değerler önbelleğe alınmaz ve her zaman yeni bir örnek olarak oluşturulur. Değerleriniz önbellek aralığına düştüğünden, değerler == operatör kullanılarak eşittir. Java dili spesifikasyonu gelen

Alıntı:

değeri p kutulaştırılmıştır Eğer doğruysa yanlış, bir bayt, u0000 \ u007f \ aralığındaki bir karakter veya bir int veya kısadır -128 ile 127 arasında bir sayı, daha sonra r1 ve r2, p'nin iki boks dönüşümünün sonuçları olsun. Her zaman r1 == r2 olduğu durumdur.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7

+0

+1: sizler çok fazla şey biliyorsunuz :) Bu önbelleğe alma işleminin daha fazlasını öğrenebileceğimiz bazı belgelere bağlantı sağlayabilir misiniz? – gameover

+1

JDK kaynağını görüntüleyin. Src.zip/java/lang/Integer adresine gidin.java ve "cache = new Integer [256];" Bu başlangıç. Ardından, "public static Integer valueOf (int i)" konusuna bakın. Bu, bu değerlerden her biri sorulduğunda önbelleğe alınan anı döndürmek için önbelleği kullanan bir yöntemdir. – helios

+0

java.lang.Character ayrıca unicodes 0 ve 127 (ascii-7/us-ascii) arasında chars için bir caché vardır. – helios

11

Bu gerçekten oluyor budur:

Integer a = 300; 
Integer b = 200; 
Integer c = 500; 
Integer d = a + b; 
System.out.println(c == d); 
:

Integer c = Integer.valueOf(5); 
Integer d = Integer.valueOf(a.intValue() + b.intValue()); 

Java -128 ile 127 arasında Integer nesnelerin bir önbellek aşağıdaki karşılaştırın korur

false ürününü yazdırmalısınız.

5

Çünkü bazı (otomatik kutulu) Integers önbelleğe alınmış, bu nedenle aslında aynı referansı karşılaştırıyorsunuz - this post daha ayrıntılı örneklere ve bir açıklamaya sahiptir.

4

Önbellekleme çok Autoboxing dışında olur, bu göz önünde bulundurun:

Integer a = 1; 
Integer b = new Integer(1); 
Integer c = Integer.valueOf(1); 

System.out.println(a == b); 
System.out.println(b == c); 
System.out.println(c == a); 

bu yazdırır:

false 
false 
true 

yüzden genellikle uzakta karşılaştıran Nesneleri '==' dan kalmak istiyorum tahmin

+0

Haklısınız. Bu, "valueOf" yönteminde uygulanan önbelleklemenin sonucudur. –

+0

Evet ama Integer.valueOf (String s) içinde eğlenceli bir şekilde değil. Ne dağınıklık. –

İlgili konular