在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》
相关推荐
自Java 7起,Java支持在`switch`语句中使用字符串作为表达式。这使得开发人员可以直接用字符串进行比较,而无需映射它们到整数值。下面是如何使用这种方式改进原始代码: ```java public void switchCaseStr() { ...
本实验报告对 Java 基本语法中字符串与数值型数据转换、从键盘输入数据的相关知识点进行了详细的介绍,并对流程控制中的 if 条件语句、for 循环语句、while 循环语句和 switch 语句的使用进行了深入的讲解。
C# 5.0 及以后的版本允许使用枚举类型、字符串以及值类型的 `switch` 表达式,而 Java 之前只支持整型、字符型和枚举类型,但自从 Java 7 引入了 `String` 类型的 `switch`,这一限制得到了放宽。 另一个不同点是,...
- 自Java 7起,引入了对`String`类型的switch支持,但case标签必须是字符串常量或字面量。 3. **case语句**: - 每个case后面跟着要比较的值和冒号。值的数据类型必须与表达式的结果类型相同,并且必须是常量或...
这里的`expression`是一个可以计算出基本类型(如`byte`、`short`、`char`、`int`)、枚举类型(`enum`)或者从Java 7开始的字符串(`String`)的值。每个`case`后面跟着一个可能的值,如果`expression`与`case`后的...
在Java 7之前,case标签后面只能是常量值,但自Java 7开始,case标签后面可以是一个`enum`常量或者一个常量表达式,这增强了switch语句的灵活性。不过,表达式的结果必须是`byte`, `short`, `char`, `int`或`enum`...
本文将详细介绍如何在Java中利用`switch`语句与字符串进行条件判断,并提供一种在Java早期版本中通过自定义枚举(`enum`)实现该功能的方法。 #### 使用String作为Switch条件的方法 ### Java 7及以后版本 在Java ...
`switch`语句适用于执行基于变量不同值的不同操作,这里的变量通常是整型、字符型(char)、枚举类型(enum)或从Java 7开始的字符串(String)。 在给定的实例中,`switch`语句被用来判断用户输入的月份,并根据...
- **字符串作为 case 值**:从 Java 7 开始,`switch` 语句支持字符串作为 case 值,这使得代码更加直观易懂。例如: ```java String str = "hello"; switch (str) { case "hello": System.out.println("欢迎...
本文将深入探讨switch语句的使用、语法、特点以及在不同编程语言中的差异,帮助你全面理解并熟练运用这一重要的编程工具。 1. **switch语句的基本概念** switch语句是条件控制结构的一种,它允许程序根据不同的...
### Java中的if语句和switch语句详解 #### 一、引言 在Java编程语言中,`if`语句和`switch`语句是非常重要的控制流语句,它们允许开发者根据不同的条件来控制程序的执行流程。这些语句不仅在逻辑判断中扮演着关键...
JAVA字符串类型switch的底层原理详析是指在JAVA语言中,switch语句是如何处理字符串类型的表达式的。从表面上看,switch语句似乎可以直接处理字符串类型的表达式,但是实际上,JAVA虚拟机(JVM)是如何实现的呢? ...
- **字符串支持**:从Java 7开始,`switch` 语句支持字符串作为表达式的值。这使得处理字符串更加灵活。 - **多条件匹配**:从Java 7开始,可以在同一个 `case` 语句中使用逗号分隔多个值,例如 `case 1, 2, 3: ......
在C和C++中,switch语句与Java类似,但不支持字符串直接作为表达式。通常需要先将字符串转换为整型(如通过哈希函数)才能与`case`匹配。此外,C++11引入了`constexpr`关键字,使得在某些情况下可以在`case`标签中...
3. **String类型(Java 7及以后版本)**:从Java 7开始,字符串也被支持,使得`switch`更加强大。 4. **switch表达式(Java 12及以后版本)**:Java 12引入了“开关表达式”,使语法更简洁,如`result = switch ...
Java 中的字符串可以使用 String 类来表示,而数值型数据可以使用基本数据类型如 int、double 等来表示。字符串与数值型数据之间的转换是 Java 编程中非常重要的一部分。 1. 字符串转换为数值型数据 Java 提供了...
在早期的Java版本中,switch仅支持常量表达式,但从Java 7开始,switch可以接受字符串(String),从Java 14开始,还支持枚举(enum)类型的switch表达式。例如: ```java switch (day) { case "Monday": System....
需要注意的是,`switch`语句不能直接处理浮点数、对象或布尔值,但Java 7引入了枚举类型的支持,Java 8引入了字符串支持,使得`switch`语句的应用更为广泛。 `if-else-if`阶梯是多个`if-else`结构的串联,常用于...
DFA是一种在理论计算机科学中广泛使用的模型,用于识别和处理特定的字符串模式。 DFA是由一系列状态和转换规则构成的机器,每个状态都有一组输入符号,根据这些输入符号,DFA会决定转移到哪个新状态。DFA识别字符串...
本篇文章详细地讲解了 Java 语言中的基本语法,包括字符串与数值型数据转换、从键盘输入数据等内容,并通过四个实验分别介绍了 if 条件语句、for 循环语句、while 循环语句和 Switch 语句的使用。