java的switch支持包装类型吗?

  • 包装类型能放在switch后面吗?
  • 包装类型能放在case后面吗?
  • JVM在处理基本类型和包装类型的区别
  • 结论
  • 参考

我们都知道java的switch支持6种数据类型:int、可以转换为int的bytecharshort以及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行,调用了IntegerintValue()方法进行了自动拆箱,然后再执行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

参考

  1. 【java】switch case支持的6种数据类型

java的switch支持包装类型吗?相关推荐

  1. 关于Java中Switch支持的数据类型

    Java中Switch支持byte.short.char.int四种基本类型,在JDK1.5中支持了枚举类型以及byte.short.char.int四种基本数据类型的包装类,在JDK1.7中支持了S ...

  2. Java中8种包装类型

    Java为8种基本的数据类型对应提供了8种包装类,包装类属于引用数据类型. 基本数据类型                    包装类型                      byte java. ...

  3. Java中switch的参数类型

    概述 在jdk1.7以下版本,switch的参数类型只能是:int 或者 enum,在jdk1.7及以上版本,参数可以为String类型!!! 当因为版本低,switch功能不支持字符串作为条件.这时 ...

  4. msgpack java_让java版msgpack支持Object类型

    msgpack是一种高效的二进制序列化格式,官方链接提供了很多中语言的实现,Java作为常用的开发语言之一,官方也提供了支持. Java版的实现官方也提供了一些QuickStart教程,这里就不多说了 ...

  5. java 基本数据类型和包装类型

    基本数据类型:byte,int, short, long, boolean,char, float,double等 包装类型: Byte,Integer,Short,Long,Boolean,Char ...

  6. Java为何要使用包装类型

    什么是包装类型?         包装类就是基本数据类型的八种 基本类型 大小 包装类型 boolean / Boolean char 16bit Character byte 8bit Byte s ...

  7. 【Java基础】--05.java基本类型与包装类型

    java中基本类型和包装类型的区别 1.包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是 2.包装类型是引用的传递,基本类型是值的传递 3.声明方式不同,基本数据类型不需要 ...

  8. java中包装类型,自动装箱与自动拆箱简述

    首先介绍一下什么是包装类型 8种基本类型 :byte   short   int   long   float   double   boolean   char 在java语言中,包装类型就是,通过 ...

  9. Java语言中的枚举类型

    枚举类型(Enumerated Type)在编程语言中常用,程序员必备食粮,下面随着我的思路来认识一下枚举类型. 是什么 枚举类型在java中是一种基本数据类型.它用于声明一组命名的常数,当一个变量有 ...

最新文章

  1. linux修改mysql默认大小写配置,linux下设置mysql不区分大小写
  2. python简说(二十二)写日志
  3. boost::mp11::mp_none_of_q相关用法的测试程序
  4. C语言常用13种算法附源码
  5. LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
  6. 如何应对缓存穿透和缓存雪崩问题?极其重要
  7. 苹果手机传照片到电脑_如何将苹果手机的照片和视频导到电脑上?小白看过来哦...
  8. 中文版orgin图像数字化工具_GetData Graph Digitizer(图表数字化工具) V2.25 官方版
  9. linux 怎么查看谁登过这台服务器,如何查看linux服务器是否被入侵
  10. 热力地图高德_高德地图热力图和设备监测
  11. 海康4200服务器进不去系统,ivms-4200客户端登入不了云服务器
  12. 【中文乱码】深入分析 Java Web 中的中文编码问题
  13. MySQL字段根据逗号隔开查询
  14. vue中使用第三方阿里巴巴矢量图标库,并修改图标大小
  15. c语言找出成绩的最大,C语言 求每个学生、每门课的平均成绩并找出最大值
  16. 娱乐而已,认真你就输了
  17. node mysql实现登陆注册_使用 NodeJs 链接 mysql 的实现登录与注册
  18. 【GlobalMapper精品教程】012:WGS84转2000地理坐标系与平面坐标系
  19. mysql 数据库军规_Mysql数据库32条军规
  20. Ubuntu下安装XAMPP

热门文章

  1. python删除多列_numpy.delete删除列的方法
  2. Zookeeper常用命令
  3. 阿里巴巴mysql dba面试题_阿里巴巴MySQL DBA面试题
  4. python局域网内通信_python实现局域网内实时通信
  5. MySQL注入及绕过备忘录
  6. R语言随机波动率(SV)模型、MCMC的Metropolis-Hastings算法金融应用:预测标准普尔SP500指数...
  7. Nmap使用教程超超超详细——最后介绍绕过防火墙IDS逃逸
  8. 把憨豆和蒙娜丽莎P成蒙娜豆沙,网络神经能办到!
  9. ubuntu关闭端口命令
  10. 计算机高级培训美好的一天,美好的一天愉快说说