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 方法来进行字符串比较?这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样。

时间: 2024-10-29 19:06:02

java7中switch比较字符串的相关文章

Java7中Switch语句支持String

Java7新特性Swith语句中支持String 实例: public class StringSwitch { public static void main(String[] args) { System.out.println(getExpendedMessage("one")); System.out.println(getExpendedMessage("three")); System.out.println(getExpendedMessage(&qu

Js中常用的字符串,数组,函数扩展

由于最近辞职在家,自己的时间相对多一点.所以就根据prototytpeJS的API,结合自己正在看的司徒大神的<javascript框架设计>,整理了下Js中常用一些字符串,数组,函数扩展,一来可以练练手,二来也锻炼下自己的代码能力.由于代码里面的注释自认为已经非常详细,所以就直接贴代码了. 1. 字符串扩展: ;(function() { var method, stringExtends = { /** * 删除字符串开始和结尾的空白 * @returns {string} */ stri

PHP中一个控制字符串输出的函数

// php 中 一个控制字符串输出的函数(中英文),每行显示多少字数,避免英文的影响 // $str 字符串 // $len 每行显示的字数(汉字×2) function rep($str,$len) { $strlen=strlen($str); $i=0; $finstr=""; $pos=0; while($i<$strlen) { $s1=substr($str,$i,1); $s2=ord($s1); if($s2>0xa0){ $finstr.=substr(

js中格式化时间字符串

.net 程序员肯定有遇到过,将一个对象json序列化之后Date 字段 就会转化成 '/Date(1370770323740)/' 这种格式的数据,下面介绍一种在js中,关于时间格式的转换. <script> function formatDate(date, format) { if (!date) return; if (!format) format = "yyyy-MM-dd"; switch(typeof date) { case "string&qu

Java基础知识强化19:Java中switch分支语句

java中switch语句: 这里expression控制表达式的数据类型只能是byte.short.char.int四种整型类型和枚举类型,不能是boolean类型: Java7(1.7)改进了switch分支语句: Java7允许switch语句中的控制表达式为java.lang.String类型(不能是StringBuffer 或者 StringBuilder) switch(expression) {     case  condition1:          {          

[转]JS中对象与字符串的互相转换

原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON.parse方法在遇到不可解析的字符串时,会抛出SyntaxError异常. 即:JSON.parse(text, reviver),This method parses a JSON text t

shell中if条件字符串、数字比对,[[ ]]和[ ]区别

shell中if条件字符串.数字比对,[[ ]]和[ ]区别 引用: http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731 http://blog.csdn.net/sunboy_2050/article/details/6836382 shell 括号 学习shell的时候总是被shell里的条件判断方式搞得头疼,经常不知道改 用[],[[]],(())还是test,let,而很少有书把它们的关系讲解的很清楚(应该是我

(转)驱动开发中使用安全字符串函数

参考链接:http://www.cppblog.com/aurain/archive/2009/09/27/97363.html 一.前言 大量的系统安全问题是由于薄弱的缓冲处理以及由此产生的缓冲区溢出造成的,而薄弱的缓冲区处理常常与字符串操作相关.c/c++语言运行库提供的标准字符串操作函数(strcpy, strcat, sprintf等)不能阻止在超出字符串尾端的写入. 基于Windows XP SP1以及随后的操作系统的Windows DDK版本提供了安全字符串函数(safe strin

笨鸟先飞随笔:ADO.NET中有关C#从App.config中使用数据库连接字符串的方法

应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.在App.config文件中,根节点是configuration,在根节点下可以创建连接字符串的节点,也就是connectionStrings. 一.关于App.config的配置方法 1.在项目中添加一个应用程序配置文件(App.config),在根节点下添加连接字符串的节点<connectionStrings></connectio