Java和交换机案例

Abh*_*bhi 9 java

有没有人知道为什么Java不允许你打开大于整数的数字?这背后有任何技术原因吗?

Von*_*onC 23

至于说在这里,开关用字节,短,char和INT基本数据类型的作品.它还适用于枚举类型和一些"包装"某些基本类型的特殊类:Character,Byte,Short和Integer.

Java switch语句被编译到JVM字节码tableswitch或lookupswitch中.这两个字节码都要求case值是唯一的,32位,整数,编译时常量.

tableswitch和lookupswitch指令都包括一个默认分支偏移和一组可变长度的case值/分支偏移对.
两个指令都从堆栈中弹出密钥(紧跟在switch关键字后面的括号中的表达式的值).
将密钥与所有案例值进行比较:

  • 如果找到匹配,则采用与案例值相关联的分支偏移.
  • 如果未找到匹配项,则采用默认分支偏移量.

尽管上面描述了实现细节,但我相信用于切换的类型是与控制流的高效字节码兼容的类型,并且它可能是这种选择的重要部分.

正如在这个Java Bug中所说:

我想您可以允许Java switch语句包含其他类型的值,并编译一个switch语句,该语句将这些值中的一种用于其他字节码,例如ifs和gotos序列.但是我们必须仔细检查所有的switch语句,以确定它是否会被编译成快速切换字节码或if-elses的慢速序列.

正如在其他Java bug中所说的那样

'switch'语句可以使用函数表调度和/或二叉树搜索来匹配case语句,而不仅仅是按顺序逐个测试它们.

  • 这是实施细节.不是这种选择的实际原因. (3认同)

Gil*_*les -8

也许是因为在开关中拥有超过整数最大情况的编程真的很糟糕?

如果你想切换长变量,只需将它们投影到整数空间即可。

  • 这不是理由,而是猜测。将 long 投影到整数空间也违背了使用 long 的目的。 (3认同)