【java】switch case支持的6种数据类型
switch表达式后面的数据类型只能是byte,short,char,int四种整形类型,枚举类型和java.lang.String类型(从java 7才允许),不能是boolean类型。
在网上看到好多文章,说switch还支持byte,short,char,int 的包装类,首先可以肯定说switch不支持这些包装类,但是如下的代码又是正确的:
public static void main(String[] args) {
switch (new Integer(45)) {
case 40:
System.out.println("40");
break;
case 45:
System.out.println("45");//将会打印这句
break;
default:
System.out.println("?");
break;
}
}
可以打印正确的结果,在挨着挨着试完Byte,Short,Character,Integer后发现都可以正确打印,于是便说switch也支持byte,short,char,int的包装类。这种说法不完全正确,之所以switch能够支持他们的包装类,是因为自动拆箱(从JDK1.5开始支持自动拆箱和自动装箱,自动拆箱就是自动将引用数据类型转化为基本数据类型,自动装箱就是自动将基本数据类型转化为引用数据类型)的原因,下面使用jclasslib软件打开上面的.class文件,
0 new #2 <java/lang/Integer> 创建一个Integer类的对象
3 dup 将对象的标识压入栈顶部
4 bipush 45 将整形45压入栈中
6 invokespecial #3 <java/lang/Integer.<init>> 调用Integer类型的构造方法
9 invokervirtual #4 <java/lang/Integer.intValue> 调用intValue()方法
12 lookupswitch 2
40:40(+28)
45:51(+39)
defalut:62(+50)
40 getstatic #5 <java/lang/System.out> 获得标准输出流
43 ldc #6 <40> 从常量池中将40的索引压入栈中
45 invokevirtual #7 <java/io/PrintStream.println> 调用println()方法
48 goto 70 (+22)
51 gestatic #5 <java/lang/System.out>
54 ldc #8 <45>
56 invokevirtual #7 <java/io/PrintStream.println>
59 goto 70 (+11)
62 getstatic #5 <java/lang/System.out>
65 ldc #9<?>
67 invokevirtual #7 <java/io/PrintStream.println>
70 return
从上面的第5行我们可以看出编译器自动调用了intValue()方法,如果是使用Byte会自动调用byteValue()方法,如果是Short会自动调用shortValue()方法,如果是Integer会自动调用intValue()方法。switch 的查找原理是使用key-offset在目标表格中查找的,lookupswitch后面的数字和goto后面的数字都是有规律的,关于更多信息可以查看The Java® Virtual Machine Specification
因此switch表达式后面的数据类型只支持byte,short,int整形类型、字符类型char、枚举类型和java.lang.String类型。
本文为博主原创作品,转载请注明出处。
【java】switch case支持的6种数据类型的更多相关文章
- switch case 支持的 6 种数据类型!
有粉丝建议可以偶尔推送一些 Java 方面的基础知识,一方面可以帮助一初学者,也可以兼顾中高级的开发者. 那么今天就讲一下 Java 中的 switch case 语句吧,有忘记的同学正好可以温习一下 ...
- Java switch case和数组
Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch case 语句格式: switch(express ...
- Java-Runoob:Java switch case
ylbtech-Java-Runoob:Java switch case 1.返回顶部 1. Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等 ...
- Redis支持的五种数据类型
redis支持的五种数据类型: 1.string(字符串) 2.hash(哈希) Redis hash 是一个键值(key=>value)对集合. Redis hash是一个string类型的f ...
- Java switch case 语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch(expression){ case value : //语句 break; //可选 ca ...
- Redis学习笔记(三)Redis支持的5种数据类型的总结
继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...
- Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash
引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...
- Java switch case语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. switch case 语句语法格式如下: switch(expression){ case value : ...
- 解决java switch……case不能匹配字符串的问题
java1.7已经支持了匹配字符串 方案1. enum Animal { dog,cat,bear; public static Animal getAnimal(String animal){ re ...
随机推荐
- Chrome DevTools — Network
Chrome DevTools — Network https://segmentfault.com/a/1190000008407729 chrome DevTools的各种使用: 在dev too ...
- Creating fields using CSOM
When creating a field, whether you are using CAML, server-side object mode, or one of the client-s ...
- APP测试体系
网上找的图片,总结的很好:
- Table折叠小技巧html-demo
1.要做一个table折叠的展示文本框直接上代码 html: <!DOCTYPE html> <html> <head> <title>table-折叠 ...
- 【Oracle】RAC下的一些经常使用命令(一)
节点层: olsnodes -n:显示每一个节点编号. [oracle@rac1 ~]# olsnodes -n rac1 1 rac2 2 -p:显示每一个节点用于private int ...
- SQL Server复制故障(1)
初始化时报错 错误消息: The process could not read file '\\176WINDOWSSQL\ReplData\unc\176WINDOWSSQL_DB2_TEST3\2 ...
- java.lang.AbstractStringBuilder.enlargeBuffer
04-18 10:22:08.585 3653-3653/com.tongyan.lanzhou.rv I/dalvikvm: "main" prio=5 tid=1 RUNNAB ...
- H5移动端JS操作LocalStorage方法
LocalStorage和SessionStorage LocalStorage 是对Cookie的优化 没有时间限制的数据存储 在隐私模式下不可读取 大小限制在500万字符左右,各个浏览器不一致 在 ...
- java如何实现不固定个数传参
CreateTime--2017年9月15日14:42:40 Author:Marydon java如何实现不固定个数传参(定义实参个数可变的方法) 参考链接:原文链接 传统方法:为这个方法定义一 ...
- oracle 判断字符串是否包含指定内容
1.情景展示 如何将表中的包含特殊字符的脏数据查出来? 2.instr()函数 语法: instr(string, substring[, start_position[, th_appearan ...