This question already has answers here:
How does Java's switch work under the hood?
(7个答案)
5年前关闭。
我试图用谷歌搜索,但是没有运气。
我的开关很大,有些情况显然比其他情况更常见。
因此,我想知道订单是否真的保持原状,并且“大”案件要在“小”案件之前得到测试,因此可以更快地进行评估。
我想保留订单,但是如果影响速度,那么重新排序分支将是一个好主意。
例如:
(7个答案)
5年前关闭。
我试图用谷歌搜索,但是没有运气。
我的开关很大,有些情况显然比其他情况更常见。
因此,我想知道订单是否真的保持原状,并且“大”案件要在“小”案件之前得到测试,因此可以更快地进行评估。
我想保留订单,但是如果影响速度,那么重新排序分支将是一个好主意。
例如:
switch (mark) {
case Ion.NULL:
return null;
case Ion.BOOLEAN:
return readBoolean();
case Ion.BYTE:
return readByte();
case Ion.CHAR:
return readChar();
case Ion.SHORT:
return readShort();
case Ion.INT:
return readInt();
case Ion.LONG:
return readLong();
case Ion.FLOAT:
return readFloat();
case Ion.DOUBLE:
return readDouble();
case Ion.STRING:
return readString();
case Ion.BOOLEAN_ARRAY:
return readBooleans();
case Ion.BYTE_ARRAY:
return readBytes();
case Ion.CHAR_ARRAY:
return readChars();
case Ion.SHORT_ARRAY:
return readShorts();
case Ion.INT_ARRAY:
return readInts();
case Ion.LONG_ARRAY:
return readLongs();
case Ion.FLOAT_ARRAY:
return readFloats();
case Ion.DOUBLE_ARRAY:
return readDoubles();
case Ion.STRING_ARRAY:
return readStrings();
default:
throw new CorruptedDataException("Invalid mark: " + mark);
}
最佳答案
对switch语句重新排序没有任何效果。
查看Java字节码规范,可以将switch
编译为lookupswitch
或tableswitch
指令,打开int
。 lookupswitch
总是使用可能的值以已排序的顺序进行编译,因此对代码中的常量进行重新排序将不会有影响,并且tableswitch
只是具有相对于指定偏移量的可能跳转的数组,因此,根本不在乎原始订单。
有关详细信息,请参见http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.lookupswitch和http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.tableswitch。
09-27 17:06