基础
我们现在使用的 Java 的版本, 基本上是都支持 String 类型的. 当然除了 String 类型, 还有 int,char,byte,short,enum 等等也都是支持的. 然而在其底部实现中, 还是基于 整型的, 也就是 int,byte,short 这些类型.
我们先来看一下 int 的一个简单例子, 主要部分源代码
- public static void main(String [] args){
- int n = 2;
- switch (n){
- case 1:
- break;
- case 2:
- break;
- case 3:
- break;
- default:
- }
- }
再使用 javac 命令编译, javap 命令反编译之后得到如下关键部分字节码:
- 0: iconst_2
- 1: istore_1
- 2: iload_1
- 3: tableswitch { // 1 to 3
- 1: 28
- 2: 31
- 3: 34
- default: 37
- }
- 28: goto 37
- 31: goto 37
- 34: goto 37
- 37: return
看不懂的话可以 点击这里 查看参考对照表.
当然懒得看的话我们也可以直接把 class 文件反编译成源代码, 可以直接将 class 文件拖进 IDEA, 得到如下代码:
- public static void main(String[] var0) {
- byte var1 = 2;
- switch(var1) {
- case 1:
- case 2:
- case 3:
- default:
- }
- }
这里总的来说和源代码变化不大, 只是将 int 类型都转化为了 byte 类型. 这里转化的原因, 在于我们最初的 case 里面的值刚好在 byte 的范围之内. 如果 case 的值稍微大点, 它可能就会转化为 short 类型, 再大点, 就直接是 int 类型了. 需要注意的是 switch 里面不支持 float,long 这些类型.
String 类型讲解
有了上文的理解之后, 下面应该会简单许多.
同样的, 还是先上源代码
- public static void main(String [] args){
- String str = "sdf";
- switch (str){
- case "aaa":
- break;
- case "ccc":
- break;
- case "bbb":
- break;
- default:
- }
- }
然后编译之后丢进 IDEA 反编译得到反编译的代码
- public static void main(String[] var0) {
- String var1 = "sdf";
- byte var3 = -1;
- switch(var1.hashCode()) {
- case 96321:
- if (var1.equals("aaa")) {
- var3 = 0;
- }
- break;
- case 97314:
- if (var1.equals("bbb")) {
- var3 = 2;
- }
- break;
- case 98307:
- if (var1.equals("ccc")) {
- var3 = 1;
- }
- }
- switch(var3) {
- case 1:
- case 0:
- case 2:
- default:
- }
- }
可以看到, String 类型的 switch, 转换为了字符串的哈希比较, 而其哈希返回的正是 int 类型. hash 相同的情况再通过 equals 方法对比字符串的值, 因此引进局部变量 var3, 是很有必要的.
来源: https://www.cnblogs.com/asche/p/11502918.html