在switch语句中使用字符串以及实现原理

匿名 (未验证) 提交于 2019-12-03 00:31:02

一次机缘巧合,在idea中调试代码的时候,跳到了.class文件中,刚好调试的代码是switch,于是就有了下面的内容:


对于Java语言来说,在Java 7之前,

switch语句中的条件表达式的类型只能是与整数类型兼容的类型,包括基本类型char、byte、short和int,与这些基本类型对应的封装类Character、Byte、Short和Integer,

还有枚举类型。这样的限制降低了语言的灵活性,使开发人员在需要根据其他类型的表达式来进行条件选择时,不得不增加额外的代码来绕过这个限制。为此,Java 7放宽

了这个限制,额外增加了一种可以在switch语句中使用的表达式类型,那就是很常见的字符串,即String类型。


源代码:

  1. publicclass
  2. publicstaticvoid
  3. "a"
  4. publicstaticvoid
  5. switch
  6. case"a"
  7. "aa"
  8. break
  9. case"b"
  10. "bb"
  11. break
  1. publicclass
  2. publicstaticvoid
  3. "a"
  4. publicstaticvoid
  5. switch
  6. case"a"
  7. "aa"
  8. break
  9. case"b"
  10. "bb"
  11. break


编译后的.class文件:

  1. import
  2. publicclass
  3. public
  4. publicstaticvoid
  5. "a"
  6. publicstaticvoid
  7. switch
  8. default
  9. break
  10. case97
  11. if(s.equals("a"
  12. "aa"
  13. break
  14. case98
  15. if(s.equals("b"
  16. "bb"
  17. break


从代码可以看出,java虚拟机实际上是将字符串转化为哈希值,还是利用整数类型兼容的类型来进行判断,但是哈希值可能存在值相等的情况,所以又对字符串进行了2次比较。

总结:switch能判断字符串是因为将字符串做了哈希运算,本质上还是数字,java虚拟机没有变化,只是编译器发生了变化。




标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!