The switch in JAVA7 supports the implementation details of string
Author: zsxwing Updated: 2013-03-04 21:08:02 posted: 2012-04-26 13:58:19
Before JAVA7, switch can only support byte, short, char, int, or its corresponding wrapper class and enum type. In Java7, string support, which was called for a long time, was finally added. For example, here is a sample code that uses string in a switch.
1 public class Test {
2
3 public void test (String str) {
4 switch (str) {
5 case "abc":
6 System.out.println ("abc");
7 break;
8 case "def":
9 System.out.println ("def");
10 break;
11 default:
12 System.out.println ("default");
13}
14}
15
16}
In the switch statement, String comparison uses String.equals, so you can use it with confidence. It should be noted that the String variable passed to the switch cannot be null, and the string used in the case clause of the switch cannot be null. Why are these non-null restrictions? In fact, as long as we disassemble this code and see how the bottom layer is implemented, we can understand. The following is the compiled code. Compiled from "Test.java" public class Test extends java.lang.Object {public Test (); Code: 0: aload_0 1: invokespecial # 1; // Method java / lang / Object. "" :() V 4: return public void test (java.lang.String); Code: 0: aload_1 1: astore_2 2: iconst_m1 3: istore_3 4: aload_2 5: invokevirtual # 2; // Method java / lang / String.hashCode :() I 8 : lookupswitch {// 2 96354: 36; 99333: 50; default: 61} 36: aload_2 37: ldc # 3; // String abc 39: invokevirtual # 4; // Method java / lang / String.equals: (Ljava / lang / Object;) Z 42: ifeq 61 45: iconst_0 46: istore_3 47: goto 61 50: aload_2 51: ldc # 5; // String def 53: invokevirtual # 4; // Method java / lang / String.equals : (Ljava / lang / Object;) Z 56: ifeq 61 59: iconst_1 60: istore_3 61: iload_3 62: lookupswitch {// 2 0: 88; 1: 99; default: 110} 88: getstatic # 6; // Field java / lang / System.out: Ljava / io / PrintStream; 91: ldc # 3; // String abc 93: invokevirtual # 7; // Method java / io / PrintStream.println: (Ljava / lang / String;) V 96: goto 118 99: getstatic # 6; // Field java / lang / System.out: Ljava / io / PrintStream; 102: ldc # 5; // String def 104: invokevirtual # 7; // Method java / io / PrintStream.println: (Ljava / lang / String;) V 107: goto 118 110: getstatic # 6; // Field java / lang / System.out : Ljava / io / PrintStream; 113: ldc # 8; // String default 115: invokevirtual # 7; // Method java / io / PrintStream.println: (Ljava / lang / String;) V 118: return} It is estimated that some students Too lazy to look at these assemblies, in fact, the above assembly code written in Java is like the following. As of this writing, everyone should be able to understand why null cannot be used.
1 public class Test {
2 public void test (String str) {
3 int i = -1;
4 switch (str.hashCode ()) {
5 case 96354: // "abc" .hashCode ()
6 if (str.equals ("abc")) {
7 i = 0;
8 }
9 break;
10 case 99333: // "def" .hashCode ()
11 if (str.equals ("def")) {
12 i = 1;
13}
14 break;
15 default:
16 break;
17}
18
19 switch (i) {
20 case 0:
21 System.out.println ("abc");
22 break;
23 case 1:
24 System.out.println ("def");
25 break;
26 default:
27 System.out.println ("default");
28}
29}
30}
If the null passed in by the switch, then calling the hashCode method on a null object at runtime will result in a NullPointerException. If the switch case is written as null, then the hashCode cannot be obtained during compilation, so an error will be reported during compilation. Switch support String is just a syntactic sugar, javac is responsible for generating the corresponding code. The underlying JVM has not been modified on the switch. Refer to http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html If the null passed by the switch, calling the hashCode method on a null object at runtime will result in a NullPointerException. If the switch case is written as null, then the hashCode cannot be obtained during compilation, so an error will be reported during compilation. Switch support String is just a syntactic sugar, javac is responsible for generating the corresponding code. The underlying JVM has not been modified on the switch.
Implementation details of switch support String in Java jre7 and above