java7中switch比较字符串

  在java1.7之前大家都清楚switch的比较范围只能局限于(int 、short 、byte 、char)之间,Java 虚拟机和字节代码这个层次上,只支持在 switch 语句中使用与整数类型兼容的类型。在1.7后switch实现字符串比较的功能。具体是如何做到的?实际上,Java虚拟机和字节码层次上只支持switch语句中使用与整数类型兼容的类型没有变,只是这个实现字符串比较的新特性是在编译器这个层次上实现的。实现的机制是:将字符串之间的比较转换为其哈希值的比较。

空口无凭,代码为证。

源代码:

package com.shc.test;

public class TestSwitch {

		public void test(String status) {
			switch (status) {
			case "killed":
				break;
			case "alive":
				break;
			case "sacrificed":
				break;
			case "die":
				break;
			default:
				break;
			}
		}

}

 编译后的class字节码反编译后如下:

package com.shc.test;

public class TestSwitch
{
  public void test(String status)
  {
    String str;
    switch ((str = status).hashCode()) { case -1131353987:
    case 99456:
      if ((str.equals("killed")) || (goto 93) || (str.equals("die"))) break; break;
    case 92903629:
    case 1585581907:
      if ((str.equals("alive")) || (goto 93) || (str.equals("sacrificed")))
        break;
    }
  }
}

  从反编译后的字节码文件中可以看出, 原来用在 switch 语句中的字符串被替换成了对应的哈希值,而 case 子句的值也被换成了原来字符串常量的哈希值。经过这样的转换,Java 虚拟机所看到的仍然是与整数类型兼容的类型。

  细心地程序猿可能发现,既然是哈希值得比较了,为什么在 case 子句对应的语句块中仍然保留 String 的 equals 方法来进行字符串比较?这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样。

转载于:https://www.cnblogs.com/Model-frog/p/5641533.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值