Java中的Switch对整型、字符型、字符串型的具体实现细节

Java 7中,switch的参数能够是String类型了,这对咱们来讲是一个很方便的改进。到目前为止switch支持这样几种数据类型:byte short int char String 。可是,做为一个程序员咱们不只要知道他有多么好用,还要知道它是如何实现的,witch对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?String类型呢?有一点Java开发经验的人这个时候都会猜想switch对String的支持是使用equals()方法和hashcode()方法。那么究竟是不是这两个方法呢?接下来咱们就看一下,switch究竟是如何实现的。程序员

 

1、switch对整型支持的实现

下面是一段很简单的Java代码,定义一个int型变量a,而后使用switch语句进行判断。执行这段代码输出内容为5,那么咱们将下面这段代码反编译,看看他究竟是怎么实现的。缓存

public class switchDemoInt {
    public static void main(String[] args) {
        int a = 5;
        switch (a) {
        case 1:
            System.out.println(1);
            break;
        case 5:
            System.out.println(5);
            break;
        default:
            break;
        }
    }
}
//output 5

反编译后的代码以下:安全

public class switchDemoInt
{
    public switchDemoInt()
    {
    }
    public static void main(String args[])
    {
        int a = 5;
        switch(a)
        {
        case 1: // '\001'
            System.out.println(1);
            break;

        case 5: // '\005'
            System.out.println(5);
            break;
        }
    }
}

咱们发现,反编译后的代码和以前的代码比较除了多了两行注释之外没有任何区别,那么咱们就知道,switch对int的判断是直接比较整数的值性能

2、switch对字符型支持的实现

直接上代码:spa

public class switchDemoInt {
    public static void main(String[] args) {
        char a = 'b';
        switch (a) {
        case 'a':
            System.out.println('a');
            break;
        case 'b':
            System.out.println('b');
            break;
        default:
            break;
        }
    }
}

编译后的代码以下: `public class switchDemoCharcode

public class switchDemoChar
{
    public switchDemoChar()
    {
    }
    public static void main(String args[])
    {
        char a = 'b';
        switch(a)
        {
        case 97: // 'a'
            System.out.println('a');
            break;
        case 98: // 'b'
            System.out.println('b');
            break;
        }
  }
}

经过以上的代码做比较咱们发现:对char类型进行比较的时候,实际上比较的是ascii码,编译器会把char型变量转换成对应的int型变量游戏

3、switch对字符串支持的实现

仍是先上代码:ci

public class switchDemoString {
    public static void main(String[] args) {
        String str = "world";
        switch (str) {
        case "hello":
            System.out.println("hello");
            break;
        case "world":
            System.out.println("world");
            break;
        default:
            break;
        }
    }
}

对代码进行反编译:开发

public class switchDemoString
{
    public switchDemoString()
    {
    }
    public static void main(String args[])
    {
        String str = "world";
        String s;
        switch((s = str).hashCode())
        {
        default:
            break;
        case 99162322:
            if(s.equals("hello"))
                System.out.println("hello");
            break;
        case 113318802:
            if(s.equals("world"))
                System.out.println("world");
            break;
        }
    }
}

看到这个代码,你知道原来字符串的switch是经过equals()hashCode()方法来实现的。记住,switch中只能使用整型,好比byteshortchar(ackii码是整型)以及int。还好hashCode()方法返回的是int,而不是long。经过这个很容易记住hashCode返回的是int这个事实。仔细看下能够发现,进行switch的实际是哈希值,而后经过使用equals方法比较进行安全检查,这个检查是必要的,由于哈希可能会发生碰撞。所以它的性能是不如使用枚举进行switch或者使用纯整数常量,但这也不是不好。由于Java编译器只增长了一个equals方法,若是你比较的是字符串字面量的话会很是快,好比”abc” ==”abc”。若是你把hashCode()方法的调用也考虑进来了,那么还会再多一次的调用开销,由于字符串一旦建立了,它就会把哈希值缓存起来。所以若是这个siwtch语句是用在一个循环里的,好比逐项处理某个值,或者游戏引擎循环地渲染屏幕,这里hashCode()方法的调用开销其实不会很大。字符串

好,以上就是关于switch对整型、字符型、和字符串型的支持的实现方式,总结一下咱们能够发现,其实swich只支持一种数据类型,那就是整型,其余数据类型都是转换成整型以后在使用switch的。

相关文章
相关标签/搜索