2012-12-15 29 views
6

Bu nasıl çalışır? Bir cevap bulamıyorum.primitive-boolean Dize birleştirme/dönüştürme için

boolean bool=true; 
System.out.println("the value of bool is : " + true); 
//or 
System.out.println("the value of bool is : " + bool); 
  • Ne gibi şeyler sahnenin arkasında devam etmektedir ki?
  • Boolean, String'e bir boole olarak dökülmesini nasıl dolaylı olarak türünde döküm yapamaz?
  • Autoboxing/Unboxing söz konusu mu?
  • toString() veya String.valueOf() gibi yöntemler bir şekilde dahil mi?
+2

Bu makaleyi okuyun: http://www.znetdevelopment.com/blogs/2009/04/06/java-string-concatenation/ –

cevap

13

, bu kurallara göre

§5.1.11. String Conversion, "str" + bool eşdeğerdir Genel ifade değerlendirilir. JLS §15.18.1. String Concatenation Operator + kaynaktan:

bir uygulama oluşturmak ve daha sonra bir ara String nesnesini kaybının engellenmesi için bir aşamada dönüşüm ve birleştirme gerçekleştirmek için tercih edilebilir. Yinelenen dize birleştirme işleminin performansını artırmak için, bir Java derleyicisi, bir ifadenin değerlendirilmesiyle oluşturulan String ara madde sayısını azaltmak için StringBuffer sınıfını veya benzer bir tekniği kullanabilir.

İlkel türler için, bir uygulama doğrudan bir ilkel türden bir dizeye dönüştürülerek bir sarmalayıcı nesnenin oluşturulmasını da en iyi duruma getirebilir. Aşağıdaki derleyicimin Örneğin ile

:

Code: 
    0: iconst_1  
    1: istore_1  
    2: getstatic  #59     // Field java/lang/System.out:Ljava/io/PrintStream; 
    5: new   #166    // class java/lang/StringBuilder 
    8: dup   
    9: ldc   #168    // String the value of bool is : 
    11: invokespecial #170    // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 
    14: iload_1  
    15: invokevirtual #172    // Method java/lang/StringBuilder.append:(Z)Ljava/lang/StringBuilder; 
    18: invokevirtual #176    // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    21: invokevirtual #69     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    24: return   
+1

, her iki kod parçacığının aynı bayt kodu oluşturması, eski IS'nin ikincisine dönüştürüldüğü anlamına gelmez mi?(bytecode'a dönüştürülmeden önce, yani) –

+0

@VinayWadhwa JLS'nin, dizgi birleştirme işlemini nasıl gerçekleştireceğini * belirttiğini sanmıyorum - yalnızca sonuç ne olmalıdır. Ancak, hatırlayabildiğim kadarıyla, Snorcle Java derleyicisi bir 'StringBuffer', ardından bir' StringBuilder' kullanarak gerçekleştirdi. JVM'nizde dize birleştirme işleminin içsel bir işlem olmasına muhtemelen izin verilebilir. – millimoose

+0

@VinayWadhwa Bu, [§15.18.1] tarafından belirtilmiş gibi görünüyor (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1): " Tekrarlanan dize birleştirme işleminin performansını artırmak için, bir Java derleyici StringBuffer sınıfını veya benzer bir tekniği kullanabilir… "ve" İlkel türler için, bir uygulama ayrıca bir sarmalayıcı nesnesinin oluşturulmasını da optimize edebilir ... " – millimoose

2

Bu bir derleyici nesnesidir. Birleştirme için sağ işlenen bir nesne ise, nesne toString() yöntemine gönderilir, işlenen bir ilkel ise, derleyici, ilkel öğeyi bir String'e dönüştürmek için hangi türe özgü davranışı kullanacağını bilir.

"str" + new Boolean(bool).toString() 

söylediğin derleyici tam olarak nasıl önemli bir gecikmeyi izin,: hiç

kesin kurallar Java Dil Şartnamede dışarı yazıldığından
+0

Gördüğmü belirtir misiniz? –

+0

@VinayWadhwa: referans için cevabımı bakın. –

2

derleyici anlamına: Bunlar aynı derlenmiş neden

boolean bool = true; 
System.out.println(new StringBuilder("the value of bool is : ").append(bool).toString()); 

:

boolean bool = true; 
System.out.println("the value of bool is : " + bool); 

tam olarak eşdeğer olan

'e
StringBuilder sb = new StringBuilder("the value of bool is : "); 
sb.append(true); 
System.out.println(sb.toString()); 

Birleştirme ve dönüştürme kuralları the JLS'da açıklanmıştır.

+0

hangi derleyici? her derleyici? Eğer bu bilginin kaynağına işaret edebilirseniz, çok takdir edilecektir. Sağladığınız başvuru, cevabınızla ilgili değil, bence .. –

+0

Şunu söylüyor: * Bir uygulama, bir ara String nesnesinin oluşturulmasını ve atılmasını önlemek için bir adımda dönüştürme ve birleştirme işlemini gerçekleştirmeyi seçebilir. Tekrarlanan dize birleştirme işleminin performansını artırmak için, bir Java derleyici StringBuffer sınıfını veya bir ifadenin değerlendirilmesiyle oluşturulan ara String nesnelerinin sayısını azaltmak için benzer bir teknik kullanabilir. * Kuralları bilmek için JLS'yi okuyun. Aslında nasıl çalıştığını bilmek için derleyiciniz tarafından oluşturulan bayt kodunu okuyun. –