JDK1.7新特性

  1. public class Test {  
        public void test(String type) {  
            switch (type) {  
            case "状况A":  
                break;  
            case "状况B":  
                break;  
            default:  
                break;  
            }  
        }  
    }
  2. public class Test {  
        public void test(String paramString) {  
            String str = paramString;  
            int i = -1;  
            switch (str.hashCode()) {  
            case 24455345:  
                if (!str.equals("状况A"))  
                    break;  
                i = 0;  
                break;  
            case 24455346:  
                if (!str.equals("状况B"))  
                    break;  
                i = 1;  
            }  
            switch (i) {  
            case 0:  
                break;  
            case 1:  
                break;  
            }  
        }  
    }
  3. 原理: jdk1.7在switch语句中能够支持string类型的参数,实际上,这个新特性是在编译器层次实现的,而在java虚拟机和字节码层次上,仍是只支持switch语句中使用与整数类型兼容的类型。这样作的目的是为了减小这个特性所影响的范围,以下降实现的代价。在编译器层次实现的含义是,虽然开发人员在java源代码的switch语句中是用字符串类型,可是在编译的过程当中,编译器会根据源代码的类型进行转换,将字符串类型转换成与整数类型兼容的类型,不一样的java编译器可能采用不一样的方式类实现这个转换,并采起不一样的优化策略。java

  4. 从反编译出来的代码能够看到,原来用在switch语句中的字符串被替换成了对应的哈希值,而case字句的值也被换成了原来字符串常量的哈希值,通过这样的转换,java虚拟机所看到的仍然是与整数类型兼容的类型,而case字句对应的语句块仍然须要使用String的equals方法来进行字符串的比较。这是由于哈希函数在映射的时候可能存在冲突,多个字符串的哈希值多是同样的,进行字符串的比较是为了保证转换以后的代码逻辑与以前的彻底同样
相关文章
相关标签/搜索