在Java中switch支持哪些数据类型_switch在Java中的演进说明

Java中switch支持的数据类型随版本演进持续扩展:Java 1–6支持byte、short、char、int及对应包装类;Java 5支持enum;Java 7支持String;Java 12引入switch表达式;Java 14起支持类型模式;Java 17支持sealed类模式匹配;Java 21正式落地完整模式匹配特性。

Java中switch支持的数据类型随着版本演进不断扩展:从最初的byteshortcharint及其包装类,到Java 5支持枚举(enum),Java 7支持String,再到Java 14引入模式匹配预览(JEP 305)、Java 17正式支持sealed类的模式匹配,以及Java 21将switch模式匹配转为正式特性(JEP 441)。

基础类型与早期支持(Java 1–6)

最初,switch仅接受能隐式转为int的整数类型:

  • byteshortcharint
  • 对应的包装类:ByteShortCharacterInteger(自动拆箱后参与比较)
  • 注意:long不支持——编译报错“incompatible types”

枚举与字符串支持(Java 5 & 7)

Java 5起可直接用enum常量作为case值;Java 7起允许String(内部通过hashCode()equals()实现,非单纯哈希跳转):

  • 枚举case必须是同一枚举类型的显式常量,如DayOfWeek.MONDAY
  • String区分大小写,且null传入会抛NullPointerException(需提前判空)
  • 编译器对String switch做了优

    化,通常生成二分查找或哈希表跳转,性能接近整型switch

表达式语法与模式匹配(Java 12–21)

Java 12开始引入switch表达式(带->箭头语法,自动终止,无fall-through),Java 14起支持类型模式(如case String s -> s.length()),Java 21正式落地完整模式匹配:

  • 支持在case中声明局部变量并绑定值,例如case Integer i -> i * 2
  • 可组合多种模式:case null, String s, Integer i -> ...
  • 支持记录(record)解构:case Point(int x, int y) -> x + y
  • 要求所有可能路径必须被覆盖(或有default),编译器强制穷尽性检查(尤其配合sealed类时)

注意事项与常见误区

实际使用中需注意版本兼容性和语义变化:

  • 老代码中的break语句在switch表达式中不允许出现(会编译错误)
  • 传统switch语句仍存在fall-through行为;新表达式用->则完全隔离各分支
  • 泛型类型擦除导致无法在case中直接写case List l——模式匹配只支持具体类型或其子类型
  • Android开发需留意:只有API 34+(对应Java 17+特性)才支持switch模式匹配