标签:整型 创建 你知道 字符串 返回 sci tput ash long
Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进。到目前为止切换支持这样几种数据类型:byte
short
int
char
String
。但是,作为一个程序员我们不仅要知道他有多么好用,还要知道它是如何实现的,开关对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?字符串类型呢?有一点的Java开发经验的人这个时候都会猜测切换对串的支持是使用的equals()方法和哈希码()方法。那么到底是不是这两个方法呢?接下来我们就看一下,切换到底是如何实现的。
下面是一段很简单的Java的代码,定义一个INT型变量一个,然后使用切换语句进行判断。执行这段代码输出内容为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;
}
}
}
我们发现,反编译后的代码和之前的代码比较除了多了两行注释以外没有任何区别,那么我们就知道,切换对int的判断是直接比较整数的值。
直接上代码:
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 switchDemoChar
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;
}
}
}
通过以上的代码作比较我们发现:对字符类型进行比较的时候,实际上比较的是ASCII码,编译器会把炭型变量转换成对应的INT型变量
还是先上代码:
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;
}
}
}
看到这个代码,你知道原来字符串的开关是通过equals()
和hashCode()
方法来实现的。记住,开关中只能使用整型,比如byte
。short
,char
(ackii码是整型)以及int
。还好hashCode()
方法返回的是int
,而不是long
,这个通过很容易记住hashCode
报道查看的的英文int
这个事实。仔细看下可以发现,进行switch
的实际的英文哈希值,然后通过使用等于方法比较进行安全检查,这个检查是必要的,因为哈希可能会发生碰撞。因此它的性能是不如使用枚举进行切换或者使用纯整数常量,但这也不是很差。因为爪哇器编译只增加了一个equals
方法,如果你比较的是字符串字面量的话会非常快,比如“abc”==“abc”。如果你把hashCode()
方法的调用也考虑进来了,那么还会再多一次的调用开销,因为字符串一旦创建了,它就会把哈希值缓存起来。因此如果这个switch
语句的英文用在一个循环里的,比如逐项处理某个值,或者游戏引擎循环地渲染屏幕,这里hashCode()
方法的调用开销其实不 会很大。
好,以上就是关于开关对整型,字符型,和字符串型的支持的实现方式,总结一下我们可以发现,其实切换只支持一种数据类型,那就是整型,其他数据类型都是转换成整型之后在使用开关的。
标签:整型 创建 你知道 字符串 返回 sci tput ash long
原文地址:https://www.cnblogs.com/lujiahua/p/11408736.html