2011-08-05 12 views
12

Yeni Java 7 Dize Anahtarı özelliğini kullanan çok basit bir sınıfı decompiled ettik. Bu sınıfa karşı Java 7 "javap" RunningJava 7 Dize anahtarı decompiled: beklenmedik yönerge

public class StringSwitch { 

    public static void main(String[] args) { 

     final String color = "red"; 
     switch (color) { 
      case "red": 
       System.out.println("IS RED!"); 
       break; 
      case "black": 
       System.out.println("IS BLACK"); 
       break; 
      case "blue": 
       System.out.println("IS BLUE"); 
       break; 
      case "green": 
       System.out.println("IS GREEN"); 
       break; 
     } 

    } 

} 

, talimatların ilginç seti (tam demonte kod here mevcuttur) üretir:

sınıf

public static void main(java.lang.String[]); 
    flags: ACC_PUBLIC, ACC_STATIC 

    Code: 
     stack=2, locals=4, args_size=1 
     ... 
     12: lookupswitch { // 4 

        112785: 56 

       3027034: 84 

       93818879: 70 

       98619139: 98 
       default: 109 
      } 
     56: aload_2  
     57: ldc   #2     // String red 
     ...  
     110: tableswitch { // 0 to 3 

         0: 140 

         1: 151 

         2: 162 

         3: 173 
       default: 181 
      } 
     140: getstatic  #8     // Field java/lang/System.out:Ljava/io/PrintStream; 
     143: ldc   #9     // String IS RED! 
     ... 
     181: return 

" LOOKUPSWITCH ", anahtar kutusu seyrek olduğunda ve TABLESWITCH'in yerini alabilen," anahtar "ifadeleri için varsayılan komut olan bir talimattır.

Yani, soru şu, neden bir "LOOKUPSWITCH" ve ardından "TABLESWITCH" izliyoruz?

Teşekkür Luciano

doğru case ifadesi bulmakta anahtarı dizeleri ile

cevap

15

2 adımlı bir işlemdir.

  1. Anahtar dizesinin hash kodunu hesaplayın ve büyük/küçük harf ifadeleri arasında bir 'hashcode eşleştirmesi' arayın, bu LOOKUPSWITCH üzerinden gerçekleştirilir. LOOKUPSWITCH altındaki büyük tamsayı sayılarına dikkat edin; bunlar, büyük/küçük harf ifadelerinde dizelerin kodlarıdır.
  2. Artık 2 dizi aynı karma kodu olabilir, ancak olası olmayabilir. Bu nedenle, gerçek dizi karşılaştırması hala yapılmalıdır. Bu nedenle, hashcode eşleştirildiğinde, anahtar dizesi eşleşmiş durum ifadesindeki dizeyle karşılaştırılır. LOOKUPSWITCH ve TABLESWITCH arasındaki talimatlar tam olarak bunu yapar. Eşleşme onaylandıktan sonra, eşleşilen vaka bildirimi için yürütülecek kod, TABLESWITCH üzerinden gerçekleştirilir. Javac veya ECJ (java için Eclipse derleyici) -

Ayrıca kullandığınız hangi derleyici belirlemek yararlı olduğunu unutmayın. Her iki derleyici de bayt kodunu farklı şekilde oluşturabilir.

+0

Cevabınız için teşekkür ederiz. Bu mantıklı. –