switch实现⽐较字符串的原理--姥姥家的程序员
switch实现⽐较字符串的原理
在java1.7之前⼤家都清楚switch的⽐较范围只能局限于(int 、short 、byte 、char)之间,Java 虚拟机和字节代码这个层次上,只⽀持在 switch 语句中使⽤与整数类型兼容的类型。在1.7后switch实现字符串⽐较的功能。具体是如何做到的?实际上,Java虚拟机和字节码层次上只⽀持switch语句中使⽤与整数类型兼容的类型没有变,只是这个实现字符串⽐较的新特性是在编译器这个层次上实现的。实现的机制是:将字符串之间的⽐较转换为其哈希值的⽐较。
源代码:
public static void main(String[] args){
switch("sitech"){
case"paas":
System.out.println("paas");
break;
case"sitech":
System.out.println("sitech");
break;
default:
break;
}
}
编译后的代码:switch语句表示范围
public static void main(String[] args)
{
String str;
switch((str ="sitech").hashCode())
{
case-902089236:
if(str.equals("sitech")){
break;
}
case3432931:
if((goto78)&&(str.equals("paas")))
{
System.out.println("paas");
return;
System.out.println("sitech");
}
break;
}
}
从反编译后的字节码⽂件中可以看出, 原来⽤在 switch 语句中的字符串被替换成了对应的哈希值,⽽ case ⼦句的值也被换成了原来字符串常量的哈希值。经过这样的转换,Java 虚拟机所看到的仍然是与整数类型兼容的类型。
既然是哈希值得⽐较了,为什么在 case ⼦句对应的语句块中仍然保留 String 的 equals ⽅法来进⾏字符串⽐较?这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是⼀样的。进⾏字符串⽐较是为了保证转换之后的代码逻辑与之前完全⼀样。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。