jdk1.7的新特征(1) --switch使用字符串

package com.test_three;

/**
 * Created by Administrator on 2017/3/15.
 */
public class Title {
    public static String generate(String name , String gender){
        String title = "";
        switch(gender){
            case "男":
                title = name + "先生";
                break;
            case "女":
//            case "\u7537":
                title = name + "女生";
                break;
            default:
                title = name;
        }
        return title;
    }
    public static void main(String[] args){
        System.out.println(generate("郭祯","男") + ",你好");
    }
}

 

在switch语句中使用字符串
在switch语句中,表达式的值不能是null,否则会在运行时抛出NullPointException,case子句中也不能使用null,否则会出现编译错误。

 

 


根据switch语句的语法要求,其case子句的值是不能重复的。这个要求对字符串类型的条件表达式同样适用。不过对于字符串来说,这种重复值的检查还有一格特殊之处,那就是java代码中的字符串可以包含Unicode转义字符。重复值的检查是在java编译器对java源代码进行相关的词法转换之后才进行的。
也就是说有些case子句的值虽然在源代码中看起来是不同的,但是经词法转义后是一样的,这就会造成编译错误。

实现原理:
实际伤,这个新特征是在编译器这个层次伤实现的。而在java虚拟机和字节代码这个层次上,还是只支持在switch语句中适用与整数类型兼容的类型。这样做的目的是为了减少这个特征所影响的范围,以降低实现的代价。虽然java源码中switch中使用了字符串类型,但是在编译过程中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数类型兼容的格式。

 


反编译可以发现,用在switch语句中的字符串被替换成了对应的哈希值,而case子句的值也被变成了原来的字符串常量的哈希值。这里注意,在case子句中对应的语句块中仍然需要使用String的equals方法进行字符串比较,这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一致。

枚举类型:
java7引入的这个新特征虽然为开发人员提供了方便,但是容易被误用,造成代码的可维护性问题。
在javaSE 5.0之前,一般的做法是使用一格整数编码为这些枚举值编号,比如0代表"男",1代表“女”。在switch中利用这个整数编码进行判断。1.5之后出现枚举,建议如果代码中多个地方使用switch语句来枚举字符串,就考虑枚举类型进行替换。

posted @ 2017-03-15 16:02  guodaxia  阅读(368)  评论(0)    收藏  举报