• 详解:Java字符串类型"switch"的底层原理


    前言:

    最近更新得会比较频繁,希望大家见谅哦!

    也感谢关注我的人,我会更加更加努力去做的!

    基础

    我们现在使用的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,是很有必要的。

    最后,感谢大家读到了这里

    我是小架,

    我们下篇文章见!

  • 相关阅读:
    MySQL事务隔离级别(InnoDB)
    Kettle连接SQL Server数据库
    jstack分析Java进程信息
    Java对Map集合进行排序
    Java堆分析 jmap+jhat
    Oracle列转行 参数动态传入iBatis使用示例
    Hive UDF函数测试
    test
    《串并行数据结构与算法(SML语言)实验》题解
    educoder SML程序设计题线下编译环境搭建
  • 原文地址:https://www.cnblogs.com/sevencutekk/p/11507798.html
Copyright © 2020-2023  润新知