2015-02-26 12 views
12

ile havuzda saymak ve bu sorulardan bazıları (!) Gerçekten yanıltıcıdır.Dize ben OCA SE 7 sınavına hazırlanıyorum println

Im sanırım bir hata bulduk kullanarak Kitaplarından birinde

, bu yüzden lütfen aşağıdaki teyit etmek istiyorum ... println yöntemi çalıştırılır

public static void main(String... args) { 
    String autumn = new String("autumn");  // line one 
    System.out.println("autumn" == "summer"); // line two 
} 

sonra kaç String nesnelerdir orada havuz? satır bir havuza dize eklemez - - hat iki "sonbahar" ve "yaz" oluşturur ve Yani kitaptaki doğru cevap 2'dir havuzuna ekler:

Anladığım kadarıyla olmasıdır Im sınav soruları ... ayrıca "yanlış" dizesi oluşturulur ve havuza eklendiğinde ile paranoyak olması gerekiyordu çünkü.

Ancak, ben de Ben 3 olması gerektiğini düşünüyorum ... ... düşünmek doğru cevap ... ya da başka kara büyü ... ... "doğru" ve zaten varsayılan falan? tarafından JVM tarafından havuza konur "false"

birisi onaylamak misiniz gibi oluyor ?


Düzenleme: sonra biraz araştırma bunu kitapta bir 'hata' söz etmek bana adil olmadığını bulmak; Genel bir ipucu olarak: sınav soruları genellikle 'aşağıdaki kod' açısından formüle edilir; Bu nedenle, açıkça, kodun yerel olarak ne yaptığıyla ilgili basit, basit bir hesaplamayla ilgileniyorlar. Dolayısıyla, kapsam, println(boolean b) uygulama veya derleyici optimizasyonlarının denetlenmesine izin vermez. "autumn" ve "false": Adil yeterince :)

+1

... –

cevap

14

O 2 dizeleri olmalıdır. İlk ilk satır tarafından oluşturulur. biter

System.out.println(false); 

PrintStream#print(boolean) arayarak:

public void print(boolean b) { 
    write(b ? "true" : "false"); 
} 

Bu yani kodundan sonra, zamanında de böyle olur derleyici sadece göstermek üzere optimize çünkü ikinci ikinci çizgi ile oluşturulur Idam edildi. Ancak sabit havuzun seviyesinde baytkoduna saklanan, sadece 1 dize sabiti sizin main yöntemi içeren sınıfın classfile içinde " olan oluşturulur Sen çalıştırarak bunu doğrulayabilirsiniz.

javap -c -verbose ClassName 
+6

Emin? [PrintStream # print (boolean) '] uygulaması (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/io/PrintStream.java#PrintStream .print% 28boolean% 29). – Tom

+0

@Tom daha sonra PrintStream sınıfı yüklendiğinde eklendi ... – immibis

+1

Havuzun içinde bir satır oluşturduğumuz gerçeği gerçekten aklımı karıştırıyor: Yeni operatörün bir dizge oluşturduğunu ancak bir dizinin oluşturulmadığını öğrendim. havuza ekle ... –

0

true ve false, String nesneleri değildir, bu nedenle sayılmazlar. Sınav soruları zor olsa da, amaç genel kavramların anlaşılmasını kontrol etmektir. Bu durumda: class loading sırasında (Çalıştırmadan önce, dize değişmezleri sabit havuza yüklenir, böylece "sonbahar" ve "yaz" sabit havuzda olacaktır.

Burada güzel tarif edilir: Geçen cümle hakkında da açıklamalarda bulunan aşağıda benim noktası oldu http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html

+2

'PrintStream # print (boole)' nin uygulanması: 'yazma (b? 'True': 'false');' 'havuza' 'true '' ve '' false' 'ekleyecektir. ('#println (boolean)' '#print (boolean)' dır) – Tom

+0

Teşekkür ederim @ Tom: Baktığım uygulama budur, ama sanırım yalnızca "doğru" ya da "yanlış" ifadesi, ifade kısa devre, değil mi? –

+0

@krimat İlginç bir soru. Dersi yüklüyorsa tüm Dize değişmezlerini ekleyebilir, ancak kesin olarak bilmiyorum. Belki [manoutis] (http://stackoverflow.com/questions/28752489/string-count-in-the-pool-with-println#28752534) doğrulama yolu size burada yardımcı olur. – Tom