Take a look at GW

【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文件,

复制代码
 1 0 new #2 <java/lang/Integer>                             创建一个Integer类的对象
 2 3 dup                                                    将对象的标识压入栈顶部
 3 4 bipush 45                                              将整形45压入栈中
 4 6 invokespecial #3 <java/lang/Integer.<init>>            调用Integer类型的构造方法
 5 9 invokervirtual #4 <java/lang/Integer.intValue>         调用intValue()方法
 6 12 lookupswitch 2
 7         40:40(+28)
 8         45:51(+39)
 9         defalut:62(+50)
10 40 getstatic #5 <java/lang/System.out>                   获得标准输出流
11 43 ldc #6 <40>                                           从常量池中将40的索引压入栈中
12 45 invokevirtual #7 <java/io/PrintStream.println>        调用println()方法
13 48 goto 70 (+22)
14 51 gestatic #5 <java/lang/System.out>
15 54 ldc #8 <45>
16 56 invokevirtual #7 <java/io/PrintStream.println>
17 59 goto 70 (+11)
18 62 getstatic #5 <java/lang/System.out>
19 65 ldc #9<?>
20 67 invokevirtual #7 <java/io/PrintStream.println>
21 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类型。

 

本文为博主原创作品,转载请注明出处。

posted @   HDWK  阅读(49034)  评论(4编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示