java的switch支持包装类型吗?
java的switch支持包装类型吗?
- 包装类型能放在switch后面吗?
- 包装类型能放在case后面吗?
- JVM在处理基本类型和包装类型的区别
- 结论
- 参考
我们都知道java的switch支持6种数据类型:int
、可以转换为int的byte
、char
、short
以及String
和枚举类型
。那么支不支持基本类型的包装类型呢?
包装类型能放在switch后面吗?
下面两段代码都能正常运行并输出 1 ,说明包装类型能够放在switch后。
package me.zhao.test;public class TestSwitchInt {public static void main(String[] args) {// int类型int a = 1;switch (a) {case 1:System.out.println(1);break;default:break;}}
}package me.zhao.test;public class TestSwitchInteger {public static void main(String[] args) {// Integer类型Integer a = new Integer(1);switch (a) {case 1:System.out.println(1);break;default:break;}}
}
包装类型能放在case后面吗?
如图所示,将包装类型、非final的int类型放在case后面都会报错case expressions must be constant expressions
,final int 放在case可正常执行。
图片失效请点击
JVM在处理基本类型和包装类型的区别
通过javap反编译查看字节码,查看TestSwitchInteger
的第18行,调用了Integer
的intValue()
方法进行了自动拆箱,然后再执行switch,从switch往后的处理过程,int 和 Integer几乎是一模一样的。
TestSwitchInt.class
javap -c .\TestSwitchInt.class
Compiled from "TestSwitchInt.java"
public class me.zhao.test.TestSwitchInt {public me.zhao.test.TestSwitchInt();Code:0: aload_01: invokespecial #8 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: iconst_1 // 将常量1压入栈顶1: istore_1 // 将栈顶int型数值存入第二个本地变量(变量 a)2: iload_1 // 将本地变量表第二个元素(刚刚存入的1)加载到操作数栈顶3: tableswitch { // 1 to 11: 20default: 30}20: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;23: iconst_124: invokevirtual #22 // Method java/io/PrintStream.println:(I)V27: goto 3030: return
}
TestSwitchInteger.class
javap -c .\TestSwitchInteger.class
Compiled from "TestSwitchInteger.java"
public class me.zhao.test.TestSwitchInteger {public me.zhao.test.TestSwitchInteger();Code:0: aload_01: invokespecial #8 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: new #16 // class java/lang/Integer 创建一个Integer对象,并将其引用压入栈顶3: dup // 将栈顶元素(Integer的引用)出栈,复制两份再入栈4: iconst_1 // 将常量int 1压入栈顶5: invokespecial #18 // Method java/lang/Integer."<init>":(I)V 调用Integer的构造方法8: astore_1 // 将栈顶引用型数值存入第二个本地变量(变量 a)9: aload_1 // 将第二个本地变量(变量 a)压入栈顶10: invokevirtual #21 // Method java/lang/Integer.intValue:()I // 调用Integer a的intValue,此处实际是将Integer a 拆箱为 int13: tableswitch { // 1 to 1 调用switch1: 32default: 42}32: getstatic #25 // Field java/lang/System.out:Ljava/io/PrintStream;35: iconst_136: invokevirtual #31 // Method java/io/PrintStream.println:(I)V39: goto 4242: return
}
结论
1、包装类型可以放在switch后面
2、包装类型不能放在case后面,字面量、基本类型常量(比如final int)可放在case后面
3、JVM通过将包装类型自动拆箱为基本类型来支持switch
参考
- 【java】switch case支持的6种数据类型
java的switch支持包装类型吗?相关推荐
- 关于Java中Switch支持的数据类型
Java中Switch支持byte.short.char.int四种基本类型,在JDK1.5中支持了枚举类型以及byte.short.char.int四种基本数据类型的包装类,在JDK1.7中支持了S ...
- Java中8种包装类型
Java为8种基本的数据类型对应提供了8种包装类,包装类属于引用数据类型. 基本数据类型 包装类型 byte java. ...
- Java中switch的参数类型
概述 在jdk1.7以下版本,switch的参数类型只能是:int 或者 enum,在jdk1.7及以上版本,参数可以为String类型!!! 当因为版本低,switch功能不支持字符串作为条件.这时 ...
- msgpack java_让java版msgpack支持Object类型
msgpack是一种高效的二进制序列化格式,官方链接提供了很多中语言的实现,Java作为常用的开发语言之一,官方也提供了支持. Java版的实现官方也提供了一些QuickStart教程,这里就不多说了 ...
- java 基本数据类型和包装类型
基本数据类型:byte,int, short, long, boolean,char, float,double等 包装类型: Byte,Integer,Short,Long,Boolean,Char ...
- Java为何要使用包装类型
什么是包装类型? 包装类就是基本数据类型的八种 基本类型 大小 包装类型 boolean / Boolean char 16bit Character byte 8bit Byte s ...
- 【Java基础】--05.java基本类型与包装类型
java中基本类型和包装类型的区别 1.包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是 2.包装类型是引用的传递,基本类型是值的传递 3.声明方式不同,基本数据类型不需要 ...
- java中包装类型,自动装箱与自动拆箱简述
首先介绍一下什么是包装类型 8种基本类型 :byte short int long float double boolean char 在java语言中,包装类型就是,通过 ...
- Java语言中的枚举类型
枚举类型(Enumerated Type)在编程语言中常用,程序员必备食粮,下面随着我的思路来认识一下枚举类型. 是什么 枚举类型在java中是一种基本数据类型.它用于声明一组命名的常数,当一个变量有 ...
最新文章
- linux修改mysql默认大小写配置,linux下设置mysql不区分大小写
- python简说(二十二)写日志
- boost::mp11::mp_none_of_q相关用法的测试程序
- C语言常用13种算法附源码
- LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
- 如何应对缓存穿透和缓存雪崩问题?极其重要
- 苹果手机传照片到电脑_如何将苹果手机的照片和视频导到电脑上?小白看过来哦...
- 中文版orgin图像数字化工具_GetData Graph Digitizer(图表数字化工具) V2.25 官方版
- linux 怎么查看谁登过这台服务器,如何查看linux服务器是否被入侵
- 热力地图高德_高德地图热力图和设备监测
- 海康4200服务器进不去系统,ivms-4200客户端登入不了云服务器
- 【中文乱码】深入分析 Java Web 中的中文编码问题
- MySQL字段根据逗号隔开查询
- vue中使用第三方阿里巴巴矢量图标库,并修改图标大小
- c语言找出成绩的最大,C语言 求每个学生、每门课的平均成绩并找出最大值
- 娱乐而已,认真你就输了
- node mysql实现登陆注册_使用 NodeJs 链接 mysql 的实现登录与注册
- 【GlobalMapper精品教程】012:WGS84转2000地理坐标系与平面坐标系
- mysql 数据库军规_Mysql数据库32条军规
- Ubuntu下安装XAMPP
热门文章
- python删除多列_numpy.delete删除列的方法
- Zookeeper常用命令
- 阿里巴巴mysql dba面试题_阿里巴巴MySQL DBA面试题
- python局域网内通信_python实现局域网内实时通信
- MySQL注入及绕过备忘录
- R语言随机波动率(SV)模型、MCMC的Metropolis-Hastings算法金融应用:预测标准普尔SP500指数...
- Nmap使用教程超超超详细——最后介绍绕过防火墙IDS逃逸
- 把憨豆和蒙娜丽莎P成蒙娜豆沙,网络神经能办到!
- ubuntu关闭端口命令
- 计算机高级培训美好的一天,美好的一天愉快说说