2015-04-26 17 views
15

. Aşağıdaki bayt koduJava'da son dizelerin birleştirilmesi nasıl yapılır? Bu snippet'i derlediğimde

public static void main(java.lang.String...); 
    flags: ACC_PUBLIC, ACC_STATIC, ACC_VARARGS 
    Code: 
    stack=1, locals=4, args_size=1 
     0: ldc   #16     // String str 
     2: astore_1 
     3: ldc   #18     // String ing 
     5: astore_2 
     6: ldc   #20     // String string 
     8: astore_3 
     9: return 

üretir

public class InternTest { 
    public static void main(String...strings){ 
     final String str1="str"; 
     final String str2="ing"; 
     String str= str1+str2; 

    } 
} 

böylece dize "dize" Bu hatta yığın 6: ldc #20 // String string aktarıldığında sürekli havuzda zaten orada. JSL

JLS §4.12.4 kaynaktan

teklif

- son Değişkenler:

ilkel türde bir değişken ya da type, bu son ve bir derleme zamanı sabiti ifadesi ile başlatıldı (§ 15.28), bir sabit değişken olarak adlandırılan 'dur. §15.28 JLS gelen Ayrıca

- constantExpression: String türünün

Derleme zamanı sabiti ifadelerinde hep "enterne" olan yüzden yöntem String # stajyer kullanarak, birbirinden farklı örneklerini paylaşmak olarak().

Yani ben dizge1 ve str2 oluşturulduktan an staj olacak biliyorum. "Str" ve hat String str= str1+str2; aynı hafızayı paylaşacak "ing" Ama dizge1 + str2 doğrudan "dizesini" in ürettiği nasıl sabit dize havuzu. final yazmayınca olduğu gibi herhangi bir String Builder sınıfını çağırmadan.? ben bu pasajı

public class IntermTest { 
    public static void main(String...strings){ 
     String str1=("str").intern(); 
     String str2=("ing").intern(); 
     String str= str1+str2; 

    } 
} 

yazdı Ama bayt kodu oluştururken ben bu

public static void main(java.lang.String...); 
    flags: ACC_PUBLIC, ACC_STATIC, ACC_VARARGS 
    Code: 
     stack=3, locals=4, args_size=1 
     0: ldc   #16     // String str 
     2: invokevirtual #18     // Method java/lang/String.intern: 
()Ljava/lang/String; 
     5: astore_1 
     6: ldc   #24     // String ing 
     8: invokevirtual #18     // Method java/lang/String.intern: 
()Ljava/lang/String; 
     11: astore_2 
     12: new   #26     // class java/lang/StringBuilder 
     15: dup 
     16: aload_1 
     17: invokestatic #28     // Method java/lang/String.valueOf 
:(Ljava/lang/Object;)Ljava/lang/String; 
     20: invokespecial #32     // Method java/lang/StringBuilder. 
"<init>":(Ljava/lang/String;)V 
     23: aload_2 
     24: invokevirtual #35     // Method java/lang/StringBuilder. 
append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     27: invokevirtual #39     // Method java/lang/StringBuilder. 
toString:()Ljava/lang/String; 
     30: astore_3 
     31: return 

Nitekim o da için stringBuilder kullanır var

stajyer şeyler

bir ilgisi var olup olmadığını görmek için birleştirme. Yani final ile bir şeyler yaptı. Kesinlikle farkında olmadığım final Strings hakkında özel bir şey var mı?

+0

şey Bunun cevabı olacağını söylüyor Bir sonraki soru: http://stackoverflow.com/a/19418517/1393766 – Pshemo

+0

@Pshemo bu net ..Ben neyse .. o herhangi bir sorun yol açabilirdi böyle güzel soru için teşekkür sanmıyorum haline gelmiştir zaman .. :) her soru harika bir öğrenme eğrisi! –

cevap

16

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28 sabit değişkenleri ifade

Basit isimler (§6.5.6.1) (§4.12.4) sabit ifadeler olduğunu söylüyor.

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28 da söyler:

  • :

    sabit bir sentezleme aniden tamamlanmaz ve ardından sadece kullanılarak oluşmaktadır basit tür ve bir String bir değerini belirten bir ifadedir basit tür ve Değişmez ve tip String değişmezleri (§3.10.1, §3.10.2, §3.10.3, §3.10.4, §3.10.5)

  • [...]
  • Katkı operatörleri + ve - (§15.18)
  • [...]
  • basit isimler (§6.5.6.1) sabit değişkenleri ifade ki (§4.12.4).

Örnek 15,28-1. Sabit İfadeler

[...] + Long.MAX_VALUE +

"tamsayı" "kudretli büyük."

String str = str1 + str2; 

aynı şekilde derlenmiş

String str = "str" + "ing"; 

aynı şekilde derlenmiştir: bu iki değişkenler sabit ifadeler olduğu

derleyici birleştirme yapar

String str = "string"; 
+0

o bayt kodunda gizli kalır ya da başka bir yere yapar neden derleyici bunu yaparsa ben yanlış Modern Java derleyicisi 'stringbuilder en append.' benim + işlemlerini dönüştürmek değilim çünkü eğer? –

+6

Dediğim gibi, birleştirme, derleyici tarafından değil, çalışma zamanında yapılır. "Str1 + str2" sabit bir ifade olduğu için, "String str = str1 + str2" satırı için oluşturulan bayt kodu, "String str =" string "' için oluşturulan satırın tam olarak aynı bayt-koduyla aynıdır. "Dizge1 + str2 sabit ifadesidir çünkü" –

+3

veya derleyici kez hesaplamak için izin verir ve yerine kodunda yer sonucudur hangi * zaman sabitlerini derlemek str1' ve 'str2' sadece herhangi sabitlerdir' Çünkü daha kesin, ama * için Bu kodu her çalıştırdığımız anda çalışma zamanında yeniden hesaplıyoruz. – Pshemo

İlgili konular