`

理解 java7 switch语句使用字符串

    博客分类:
  • Java
阅读更多

     在jdk1.7中switch语句可以支持String类型的参数,实际上,这个新特性是在编译器这个层次上实现的而在 Java 虚拟机和字节代码这个层次上,还是只支持在 switch 语句中使用与整数类型兼容的类型。这么做的目的是为了减少这个特性所影响的范围,以降低实现的代价。在编译器层次实现的含义是,虽然开发人员在 Java 源代码的 switch 语句中使用了字符串类型,但是在编译的过程中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数类型兼容的格式。不同的 Java 编译器可能采用不同的方式来完成这个转换,并采用不同的优化策略。

       写一个如下的Test类,源码如下:

public class Test {

	public void test(String type) {
		switch (type) {
		case "情况A":
			break;
		case "情况B":
			break;
		default:
			break;
		}
	}
}

          编译成class文件之后,再通过反编译工具得到如下代码:

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;
		}
	}
}

          从上面的代码中可以看出,原来用在 switch 语句中的字符串被替换成了对应的哈希值,而 case 子句的值也被换成了原来字符串常量的哈希值。经过这样的转换,Java 虚拟机所看到的仍然是与整数类型兼容的类型。在这里值得注意的是,在 case 子句对应的语句块中仍然需要使用 String 的 equals 方法来进行字符串比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样。

 

参考:《深入理解Java7》

分享到:
评论
1 楼 gf757830515 2014-11-26  
[color=orange][/color][/size]l]
     

相关推荐

    JAVA字符串类型switch的底层原理详析

    主要给大家介绍了关于JAVA字符串类型switch的底层原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用JAVA具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    java笔记.docx

    Java中的条件语句使用关键字if-else实现,也可以使用switch语句。 Java中的循环语句有for、while和do-while。 Java中的方法可以接受参数并返回值。 Java中的类是对象的模板,可以包含属性和方法。 Java中的包是一组...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-091-Java基本语法-控制语句-switch语句-字符串作为比较对象.avi 北京动力节点-Java编程零基础教程-092-Java基本语法-控制语句-switch语句-举例1.avi 北京动力节点-Java编程零...

    Java开发技术大全(500个源代码).

    rankingBySwitch.java 用switch语句评定成绩等级 realExample.java 演示浮点数的有效位数 remainder.java 取余运算示例 showBreak.java 利用标号语句跳转出所有循环嵌套 showCount.java 循环计数示例 ...

    StudentManagementSystem.java

    该程序通过使用一个字符串数组来存储学生姓名,使用 Scanner 类来获取用户输入,并通过 switch 语句来根据用户选择的操作进行相应的处理。具体实现包括四个方法: showStudents、addStudent、modifyStudent 和 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.2.6 在字符串中查找子字符串或字符 226 9.2.7 替换字符串中的内容 226 9.2.8 String对象——磐石刻字 227 9.3 String类的最佳拍档——StringBuffer类 227 9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    9.2.6 在字符串中查找子字符串或字符 226 9.2.7 替换字符串中的内容 226 9.2.8 String对象——磐石刻字 227 9.3 String类的最佳拍档——StringBuffer类 227 9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String...

    Java语言的科学与艺术 斯坦福大学经典教材

    3.7 小结 3.8 复习题 3.9 编程练习 第4章 语句形式 4.1 Java的语句类型 4.2 控制语句和问题解决 4.3 if 语句 4.4 switch语句 4.5 while语句 4.6 for语句 4.7 小结 4.8 复习题 4.9 编程练习 第5章 方法 5.1 方法概述 ...

    jdk-13.0.1_windows-x64_bin.exe

    switch 表达式扩展了 switch 语句,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的“case L ->”模式匹配语法作用于不同范围并...

    Java经典编程源码基础例程300.zip

    实例022 用switch语句根据消费 金额计算折扣 29 实例023 判断用户输入月份的季节 31 实例024 使用while循环语句与自增 运算符循环遍历数组 33 实例025 使用for循环输出杨辉三角形 34 实例026 使用嵌套循环在控制台上...

    Java语言的科学与艺术(国外计算机科学经典教材)

     4.4 switch语句  4.5 while语句  4.6 for语句  4.7 小结  4.8 复习题  4.9 编程练习 第5章 方法  5.1 方法概述  5.2 编写自己的方法  5.3 方法调用过程的技巧  5.4 分解  5.5 算法方法  5.6 小结  5.7...

    java基础知识

    二 如何使用字符串: 42 三 length 表示字符串的长度 42 四 字符串的比较 equals ; 43 五 字符串的连接:concat + append(追加) 43 六 转义符 字符串长度加 双引号 就在 后边加 " 如果要加 单引号 就在 后边...

    疯狂JAVA讲义

    9.6.4 使用MessageFormat处理包含占位符的字符串 349 9.6.5 使用类文件代替资源文件 350 9.6.6 使用NumberFormat格式化数字 350 9.6.7 使用DateFormat格式化日期 352 9.7 本章小结 355 本章练习 355 第10章 ...

    java范例开发大全源代码

     3.5 switch语句 45  实例31 判断字母分类 46  实例32 优良及差 47  实例33 打印任意一年日历 48  实例34 一年四季的划分 51  第2篇 Java数据处理  第4章 异常处理(教学视频:62分钟) 54  ...

    Java范例开发大全 (源程序)

     3.5 switch语句 45  实例31 判断字母分类 46  实例32 优良及差 47  实例33 打印任意一年日历 48  实例34 一年四季的划分 51  第2篇 Java数据处理  第4章 异常处理(教学视频:62分钟) 54  4.1 编译...

    java范例开发大全

    3.5 switch语句 45 实例31 判断字母分类 46 实例32 优良及差 47 实例33 打印任意一年日历 48 实例34 一年四季的划分 51 第2篇 Java数据处理 第4章 异常处理(教学视频:62分钟) 54 4.1 编译时异常 54 实例35 除0...

    AIC的Java课程1-6章

     能够使用String,StringBuffer,StringBuilder类创建字符串对象和使用其方法,分辨不同类之间的区别。  能够使用Date, Calendar, Locale, DateFormat,NumberFormat类创建、改变和显示日期、数字和货币...

    计算机程序设计(Java)-教案--单元二--Java语言开发基础.docx.docx

    数据类型、运算符、字符串、数组等知识在编程过程中能熟练、准确应用; ・:・能熟练、准确地应用分支、循环、跳转三种流程执行过程; 教学重点 :・标识符命名规那么、数据类型与运算符; : 嵌套ifelse语句的用法...

    java范例开发大全(pdf&源码)

    3.5 switch语句 45 实例31 判断字母分类 46 实例32 优良及差 47 实例33 打印任意一年日历 48 实例34 一年四季的划分 51 第2篇 Java数据处理 第4章 异常处理(教学视频:62分钟) 54 4.1 编译时异常 54 实例35 除0...

Global site tag (gtag.js) - Google Analytics