『Java 语法基础』能在 Switch 中使用 String 吗?

从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实现在 switch 中使用字符串的 hash code。

从 Java 7 开始,Java 语言支持在 switch 语句中直接使用 String 类型的变量。之前的版本只允许在 switch 语句中使用 整型枚举 和一些 特定的类(比如 CharacterByteShortInteger)。

使用字符串作为 switch 条件时,实际上 Java 编译器会做一些额外的工作。编译器首先会获取到每个 case 中字符串的 hashCode 值,这是一个整型值。然后,switch 语句实际上是根据这个 hashCode 来转换执行不同的 case 的。由于 hashCode 可能会出现碰撞(不同的字符串可能有相同的 hashCode),编译器还会生成一段额外的代码来确保字符串确实是相等的,以此来避免由于 hashCode 碰撞带来的错误判断。

简单来说,当你在 switch 语句中使用字符串时,Java 在底层做了这样的处理:

  1. 计算 switch 条件中字符串的 hashCode 值。
  2. 用这个 hashCode 值来找到匹配的 case
  3. 检查找到的 case 中的字符串与 switch 条件中的字符串是否真正相等(使用 .equals 方法)。
  4. 如果相等,则执行对应的代码块;如果不相等,继续检查后面的 case,或者执行 default 块(如果有的话)。

这个处理方式的好处是,你可以直接用字符串来控制 switch 流程,而不用手动去写一堆 if-else 条件判断,看起来更加简洁和清晰。但是需要注意 hashCode 的碰撞问题,虽然 Java 编译器会帮你处理,但这也意味着,比起使用整型,使用字符串作为 switch 条件可能会有更多的性能开销。

在 Java 中,hashCode 是一个方法,它属于 Object 类。由于 Object 类是所有 Java 类的父类,这意味着每个 Java 对象都有这个方法。hashCode 的作用是提供一个整数值,这个值被用作对象的 “哈希码”。

哈希码的主要用途之一是在哈希表这类数据结构中快速查找对象。哈希表是一种常用的数据结构,用来存储键值对(key-value pairs),它可以快速插入和检索数据。

当 Java 中的 hashCode 方法被调用时,它会根据对象的内容(通常是对象中的字段)来计算并返回一个整数值。对于同一个对象多次调用 hashCode 方法,只要对象的内容没变,它应该总是返回相同的值。而不同的对象则可能会返回不同的值。

但是 “可能” 是关键词——实际上,不同对象有时会产生相同的哈希码,这称为哈希碰撞。就像两个不同的人可以有同一个电话号码一样。因此,在使用哈希码时,我们需要额外的逻辑来处理这种碰撞。

总结一下,hashCode 是对象的一个整数表示,主要用于快速查找,但需要额外的步骤来确保精确的匹配,以防不同的对象产生相同的哈希码。在 switch 语句中使用字符串,就涉及到了这些 hashCode 的处理过程。

完整代码可在此查阅:GitHub

posted @   BNTang  阅读(503)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
  1. 1 总会有人离开 王巨星
  2. 2 月亮 孟凡明
  3. 3 迟里乌布
  4. 4 我只能离开 颜人中
  5. 5 达尔文 蔡健雅
  6. 6 夜色滚烫 叶明净
  7. 7 你的星环 路飞文
  8. 8 不再说话 三块木头
  9. 9 黄昏 粥粥和小伙/粥粥
  10. 10 爱不单行 刘大拿
  11. 11 心动贩卖机 PIggy
  12. 12 别来无恙 苏星婕
  13. 13 我们的歌 刘大拿
  14. 14 一直很安静 王贰浪
  15. 15 去有风的地方 清音
  16. 16 雪 Distance Capper/罗言
  17. 17 坏女孩 徐良/小凌
  18. 18 乐园 沧桑Cang333/虎皮蛋/曲甲
  19. 19 Ayo(Explicit) Chris Brown/Tyga
  20. 20 我的美丽feat.海洋Bo 海洋Bo/高睿
  21. 21 世事可爱 粥粥和小伙/粥粥
  22. 22 我记得 赵雷
  23. 23 我想牵着你的手 许嵩
  24. 24 人们都不懂 刘诺然
  25. 25 寻一个你(电视剧《苍兰诀》温情主题曲) TTTTTeehom
  26. 26 子莫格尼 杉和
  27. 27 Cat Cafe Shoffy
  28. 28 风停了雨停了我们还拥抱着 Superluckyqi
  29. 29 寂寞沙洲冷 于潼
  30. 30 三国恋 王巨星
  31. 31 达尔文 林俊杰
  32. 32 有些 颜人中
  33. 33 小模样 张小只ya
  34. 34 是否 程响
  35. 35 楼顶上的小斑鸠 队长
  36. 36 笑场 薛之谦
  37. 37 还是分开 张叶蕾
  38. 38 修炼爱情 林俊杰
  39. 39 二零三 毛不易
  40. 40 雅俗共赏 许嵩
  41. 41 Serendipity 古瑞斯Graps/Zakiya晴子
  42. 42 就让这大雨全都落下·2023 刘大拿
  43. 43 老男孩 筷子兄弟
  44. 44 有何不可 许嵩
  45. 45 缓缓 杜宣达
  46. 46 好久不见 陈奕迅
  47. 47 爱的魔法(Cover 金莎) 封茗囧菌
  48. 48 在你的身边 盛哲
  49. 49 带我去找夜生活 告五人
  50. 50 假面舞会 很美味
  51. 51 STAY The Kid LAROI/Justin Bieber
  52. 52 我好想睡觉的 无敌西红柿
  53. 53 日不落(温柔版)
  54. 54 恋爱画板 锦零
  55. 55 7710 好乐无荒/尹露浠
  56. 56 给你呀(又名:for ya) 蒋小呢
  57. 57 Love Story Taylor Swift
  58. 58 Plain Jane(Remix 13z) 鱼幼微
  59. 59 晚风 7opy/BT07
  60. 60 拜托 孙晨
  61. 61 乌梅子酱 李荣浩
  62. 62 南半球与北海道 范倪Liu
  63. 63 星河万里 Rom邢锐
好久不见 - 陈奕迅
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 施立

作曲 : 陈小霞

编曲 : 孙伟明/C. Y. Kong/陈珀

我来到 你的城市

走过你来时的路

想象着 没我的日子

你是怎样的孤独

拿着你 给的照片

熟悉的那一条街

只是没了你的画面

我们回不到那天

你会不会忽然地出现

在街角的咖啡店

我会带着笑脸 挥手寒暄

和你 坐着聊聊天

我多么想和你见一面

看看你最近改变

不再去说从前 只是寒暄

对你说一句

只是说一句

好久不见

拿着你 给的照片

熟悉的那一条街

只是没了你的画面

我们回不到那天

你会不会忽然地出现

在街角的咖啡店

我会带着笑脸 挥手寒暄

和你 坐着聊聊天

我多么想和你见一面

看看你最近改变

不再去说从前 只是寒暄

对你说一句

只是说一句

好久不见

Produced by Davy Chan / C.Y.Kong / 陈奕迅

Production Coordination : Stanley Leung

Arrangement : 孙伟明 / C.Y.Kong / 陈珀

Keyboards & Programming : C.Y.Kong

Piano : 孙伟明

Percussion : Davy Chan & Kevin (Hardpack)

Strings Arranged by C.Y.Kong & 陈珀

Strings Conducted by 陈珀

Recorded at aroom studio & seewisehk,

Engineered by Davy Chan & C.Y.Kong

Vocals & Piano Recorded at Avon Studios,

Engineered by Anthony Leung

Mixed by Simon Li at nOiz

OP : Roof Top Music Studio (adm by EMI Music Publishing (S.E. Asia) Ltd, Taiwan Branch)

/ EMI Music Publishing (S.E. Asia) Ltd, Taiwan Branch

SP : EMI Music Publishing HK

点击右上角即可分享
微信分享提示