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

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的判断是直接比较整数的值

Switch对字符型的支持

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 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型变量

Switch对字符串类型的支持

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()方法的调用也考虑进来了,那么还会再多一次的调用开销,因为字符串一旦创建了,它就会把哈希值缓存起来。因此如果这个switch语句是用在一个循环里的,比如逐项处理某个值,或者游戏引擎循环地渲染屏幕,这里hashCode()方法的调用开销其实不会很大。

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

switch对String的支持相关推荐

  1. Java基础:String类支持几种构造函数?

    String类支持几种构造函数.将创建空String的构造函数称为默认构造函数.例如, String s = new String(); 将创建一个String实例,该实例中不包含字符. 通常希望创建 ...

  2. Golang 中使用 JSON 的一些小技巧 陶文 陶文 3 个月前 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:,string 就可以支持了

    Golang 中使用 JSON 的一些小技巧 陶文 3 个月前 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用. 本来用一个json:",string" ...

  3. IDEA使用switch传入String编译不通过

    今天在使用IDEA的时候,用到switch分支语句,传入String参数的时候一直报错,下面是源码报错截图: 看错误提示并没有提到switch支持String类型,不过ava1.7之后就支持Strin ...

  4. Switch用String做参数

    Switch能否用String做参数? 参数可以是整数表达式,JDK1.5开始支持Enum类,JDK1.7开始支持String. 当字符串不会频繁改变时可以用枚举来代替String:用Enum.par ...

  5. 一个开源的任天堂 Switch 游戏模拟器,支持 1700+ 款游戏

    [导语]:Ryujinx 是使用 C# 编写的 Switch 模拟器,它支持你在上面试玩 1700 款可玩的 Switch 游戏. 简介 Ryujinx是使用C#编写的Switch模拟器,它支持你在上 ...

  6. java switch char_Java7中Switch为什么只支持byte、short、char、int、String

    Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进.到目前为止switch支持这样几种数据类型:byte short int char String .但是,作 ...

  7. Java修炼之路——基础篇——String

    String 1:字符串的不可变性 什么是不可变对象?不可变对象是指创建后无法变更的对象 String为什么是不可变的?String类为final,并且内部字符数组也为final.所以String对象 ...

  8. [初级]Java中的switch对整型、字符型、字符串的具体实现细节

    转载自 [初级]Java中的switch对整型.字符型.字符串的具体实现细节 Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进.到目前为止switch支持这样 ...

  9. Java的12个语法糖【转】

    本文转载自公众号  Hollis 原创: 会反编译的 Hollis 侵权删 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学 ...

最新文章

  1. thinking in object pool
  2. 此三层非彼三层——MVCamp;UBD
  3. python数字判断规则_判断Python输入是否为数字、字符(包括正则表达式)-阿里云开发者社区...
  4. oxford5k和paris6k数据集介绍_sklearn函数:KFold(分割训练集和测试集)
  5. Latex \bibliographystyle+修改字体字号的大小
  6. [讨论帖] 程序员如何赚外快?
  7. win8 oracle10g,win7/win8 下安装oracle10g的方法
  8. static_cast与dynamic_cast转换
  9. ubuntu下gns3 0.7安装笔记
  10. Access to the path Library\UnityAssemblies\UnityEngine.xml is denied.
  11. 测试苹果电脑性能软件xbench在哪,Mac OS操作系统性能对比测试
  12. 给我“空降”一个弟兄
  13. 基于cesium的三维管线系统综述
  14. tomcat启动后无法访问到8080页面的原因
  15. 路由器和三层交换机的基本实验操作
  16. android 取imei p10,纯干货 | 一般人不知道的几个华为P10小技巧
  17. 设置 app 不能在模拟器上运行
  18. 张量分解-Tucker分解
  19. 学生宿舍管理项目开发计划书_学生宿舍管理系统项目计划书.doc
  20. 【七夕如何根据情侣倾听的音乐进行薅羊毛】背景音乐是否会影响情侣对酒的选择

热门文章

  1. Photoshop 实例:四步让暗黄肤色变白
  2. 金山网盾V3.5产品档案
  3. windows下npm安装vue 问题和解决方法
  4. 高性能Web应用扩展
  5. oracle 查询数据库io,查看Oracle数据文件和磁盘i/o情况
  6. java基于springboot框架开发的办公自动化OA系统
  7. 请简述什么是spring的ioc和di_Spring中的IoC与DI的理解
  8. 语音模块的开发(LU-ASR01智能语音控制模块)
  9. PHP数组合并的几种方式
  10. 2013autocad学习2