(七)switch
1.switch-case注意事项
switch(A),括号中A的取值只能是整型(包括不同的长度整型,例如short)或者可以转换为整型的数值类型,比如byte、short、int、char、还有枚举;需要强调的是:long、String、float、double类型是不能作用在switch语句上的,必须强制转换成int型才能使用。
case B:C;case是常量表达式,也就是说B的取值只能是常量(需要定义一个final型的常量,必须是编译时的常量)或者int、byte、short、char(比如1、2、3、200000000000(注意了这是整型); case后的语句可以不用大括号,就是C不需要用大括号包裹着;
default就是如果没有符合的case就执行它,default并不是必须的.
二、switch对整型
下面是一段很简单的Java代码,定义一个int型变量a,然后使用switch语句进行判断。执行这段代码输出内容为5,那么我们将下面这段代码反编译,看看他到底是怎么实现的。
public class switchDemoInt {
public static void main(String[] args) {
int a = 5;
switch (a) {
case 1:
System.out.println(1);
break;
case 5:
System.out.println(5);
break;
default:
break;
}
}
}
//output 5
反编译后的代码如下:
public class switchDemoInt
{
public switchDemoInt()
{
}
public static void main(String args[])
{
int a = 5;
switch(a)
{
case 1: // '\001'
System.out.println(1);
break;
case 5: // '\005'
System.out.println(5);
break;
}
}
}
我们发现,反编译后的代码和之前的代码比较除了多了两行注释以外没有任何区别,那么我们就知道,switch对int的判断是直接比较整数的值。
三、switch对字符型支持的实现
public class switchDemoInt {
public static void main(String[] args) {
char a = 'b';
switch (a) {
case 'a':
System.out.println('a');
break;
case 'b':
System.out.println('b');
break;
default:
break;
}
}
}
编译后的代码如下: `public class switchDemoChar
public class switchDemoChar
{
public switchDemoChar()
{
}
public static void main(String args[])
{
char a = 'b';
switch(a)
{
case 97: // 'a'
System.out.println('a');
break;
case 98: // 'b'
System.out.println('b');
break;
}
}
}
通过以上的代码作比较我们发现:对char类型进行比较的时候,实际上比较的是ascii码,编译器会把char型变量转换成对应的int型变量
四、switch对字符串支持的实现
public class switchDemoString {
public static void main(String[] args) {
String str = "world";
switch (str) {
case "hello":
System.out.println("hello");
break;
case "world":
System.out.println("world");
break;
default:
break;
}
}
}
对代码进行反编译:
public class switchDemoString
{
public switchDemoString()
{
}
public static void main(String args[])
{
String str = "world";
String s;
switch((s = str).hashCode())
{
default:
break;
case 99162322:
if(s.equals("hello"))
System.out.println("hello");
break;
case 113318802:
if(s.equals("world"))
System.out.println("world");
break;
}
}
}
看到这个代码,你知道原来字符串的switch是通过equals()
和hashCode()
方法来实现的。记住,switch中只能使用整型,比如byte
。short
,char
(ackii码是整型)以及int
。还好hashCode()
方法返回的是int
,而不是long
。通过这个很容易记住hashCode
返回的是int
这个事实。仔细看下可以发现,进行switch
的实际是哈希值,然后通过使用equals方法比较进行安全检查,这个检查是必要的,因为哈希可能会发生碰撞。因此它的性能是不如使用枚举进行switch或者使用纯整数常量,但这也不是很差。因为Java编译器只增加了一个equals
方法,如果你比较的是字符串字面量的话会非常快,比如”abc” ==”abc”。如果你把hashCode()
方法的调用也考虑进来了,那么还会再多一次的调用开销,因为字符串一旦创建了,它就会把哈希值缓存起来。因此如果这个siwtch
语句是用在一个循环里的,比如逐项处理某个值,或者游戏引擎循环地渲染屏幕,这里hashCode()
方法的调用开销其实不会很大。
好,以上就是关于switch对整型、字符型、和字符串型的支持的实现方式,总结一下我们可以发现,其实swich只支持一种数据类型,那就是整型,其他数据类型都是转换成整型之后在使用switch的。
五、case语句后的break
若不写,会找到第一个对应的后继续往后执行;若写,找到相应的case后,会立刻跳出switch
参考:
https://www.hollischuang.com/archives/61