『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 @ 2024-03-18 00:57  BNTang  阅读(376)  评论(0编辑  收藏  举报