A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Synaric 于 2015-9-26 23:14 编辑

今天被这个问题卡住了,不多说上代码
  1. public class MultipleSelectionsDemo {
  2.         public static void main(String[] args) {
  3.                 String str = "A";
  4.                
  5.                 switch (str) {
  6.                 case "A":
  7.                         System.out.println("case A");
  8.                         break;
  9.                 case "B":
  10.                         System.out.println("case B");
  11.                         break;
  12.                 case "C":
  13.                         System.out.println("case C");
  14.                         break;
  15.                 default:
  16.                         break;
  17.                 }
  18.         }
  19. }
复制代码
   反编译下
  1. import java.io.PrintStream;

  2. public class MultipleSelectionsDemo
  3. {

  4.     public MultipleSelectionsDemo()
  5.     {
  6.     }

  7.     public static void main(String args[])
  8.     {
  9.         String str = "A";
  10.         String s;
  11.         switch((s = str).hashCode())
  12.         {
  13.         default:
  14.             break;

  15.         case 65: // 'A'
  16.             if(s.equals("A"))
  17.                 System.out.println("case A");
  18.             break;

  19.         case 66: // 'B'
  20.             if(s.equals("B"))
  21.                 System.out.println("case B");
  22.             break;

  23.         case 67: // 'C'
  24.             if(s.equals("C"))
  25.                 System.out.println("case C");
  26.             break;
  27.         }
  28.     }
  29. }
复制代码

    可以看到编译器偷偷加了点什么,case后面依旧只能跟常量,通过String.hashCode和String.equals来控制流程。
    继续用javap看看switch实现
  1.     Code:
  2.        0: ldc           #16                 // String A
  3.        2: astore_1
  4.        3: aload_1
  5.        4: dup
  6.        5: astore_2
  7.        6: invokevirtual #18                 // Method java/lang/String.hashCode:()I
  8.        9: lookupswitch  { // 3
  9.                     65: 44
  10.                     66: 56
  11.                     67: 68
  12.                default: 113
  13.           }
  14.       44: aload_2
  15.       45: ldc           #16                 // String A
  16.       47: invokevirtual #24                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
  17.       50: ifne          80
  18.       53: goto          113
  19.       56: aload_2
  20.       57: ldc           #28                 // String B
  21.       59: invokevirtual #24                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
  22.       62: ifne          91
  23.       65: goto          113
  24.       68: aload_2
  25.       69: ldc           #30                 // String C
  26.       71: invokevirtual #24                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
  27.       74: ifne          102
  28.       77: goto          113
  29.       80: getstatic     #32                 // Field java/lang/System.out:Ljava/io/PrintStream;
  30.       83: ldc           #38                 // String case A
  31.       85: invokevirtual #40                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  32.       88: goto          113
  33.       91: getstatic     #32                 // Field java/lang/System.out:Ljava/io/PrintStream;
  34.       94: ldc           #46                 // String case B
  35.       96: invokevirtual #40                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  36.       99: goto          113
  37.      102: getstatic     #32                 // Field java/lang/System.out:Ljava/io/PrintStream;
  38.      105: ldc           #48                 // String case C
  39.      107: invokevirtual #40                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  40.      110: goto          113
  41.      113: return
  42. }
复制代码
   好吧看来是lookupswitch了,新世界的大门打开了,TM真是没完没了(/゚Д゚)/ 以后深入研究JVM下。。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马