Java中有类似于分支/跳转表的东西吗?

Java中有类似于分支/跳转表的东西吗?,java,branch,jump-table,Java,Branch,Jump Table,Java是否有类似于分支或跳转表的东西 分支或跳转表是 用于描述使用分支指令表将程序控制(分支)转移到程序另一部分(或可能已动态加载的不同程序)的有效方法的术语 Java有这样的语句吗?还是我只需要使用if/else if/else或case语句?Java有一个,但它是否编译成字节码跳转表取决于实现。通常,如果编译器在switch语句中为每种情况找到合适的常量,它们会为您构建一个跳转表。不过,我不确定您是否真的应该关心它是如何实现的。如果您首先使用Java进行编码,那么让编译器和JIT为您处理这

Java是否有类似于分支或跳转表的东西

分支或跳转表是

用于描述使用分支指令表将程序控制(分支)转移到程序另一部分(或可能已动态加载的不同程序)的有效方法的术语

Java有这样的语句吗?还是我只需要使用if/else if/else或case语句?

Java有一个,但它是否编译成字节码跳转表取决于实现。通常,如果编译器在switch语句中为每种情况找到合适的常量,它们会为您构建一个跳转表。不过,我不确定您是否真的应该关心它是如何实现的。如果您首先使用Java进行编码,那么让编译器和JIT为您处理这些事情可能会很好

请注意,switch仅适用于整数基元类型和枚举,因此如果您使用其他对象类型,则需要使用if/else语句(而且您可能不应该为了相等而比较double或float)


最后,即使enum引用在技术上是“常量”,但如果switch语句位于定义enum的同一编译单元中,则某些编译器仅会在打开enum时生成跳转表。否则,它将生成一个if/else链(对于常规对象,您必须这样做)。有关详细的细节,请参阅。

我认为您不需要Java中的那种性能测试。我将首先集中精力编写可读的代码和使用合适的算法——这些将带来比您所讨论的更多的性能优势

在大多数独立应用程序中,绝大多数时间都花在坐着等待用户做某事上。在大多数web应用程序中,JVM中运行字节码的时间应该被网络时间、数据库时间或业务逻辑所占用

如果您真的担心Java应用程序的部分性能,您可以将其转移到JNI代码中,完全绕过Java解释器。

我认为这就是一些switch语句在“幕后”实现的方式


除此之外,您还可以使用类似的
HashMap
,使用
map.get(something.invoke()
。但这有点违背了目的,因为它没有跳转表那么快,而且我想不出一个好的例子,OOP编程/多态性不能更好、更干净地完成这项工作。

你可以通过反射和存储匿名内部类的通用HashMap来实现这一点,但这将是一个可怕的黑客行为


由于本机匿名方法,在C#中使用非常优雅,但在java中则不然。

您所说的那种分支/跳转表不是由java、C等高级语言直接提供的,而是由编译器以机器代码或字节代码生成的。换句话说,编译器可能会使用它们,但您看不到它们

Java有这样的东西吗?还是我只需要使用if/else if/else或case语句

我认为case语句(在java中带有开关)是等价的

此外,在OOP中,开关可以编码一次,然后让多态性进入作业

发件人:

这取决于你的要求

用于描述使用分支指令表将程序控制(分支)转移到程序另一部分(或动态加载的不同程序)的有效方法的术语。”

传递程序控制的一种方法是调用一个函数。当有几个函数可供选择时,调用正确函数的一种方法是将其从对象类型中去掉。这称为多态性。Java和其他面向对象语言具有多态性,通过继承(子类化)实现不确定它是如何在java中实现的,但是C++中,每个对象中都有(通常还是?)指针指向它的类的V表,它包含指向虚函数的指针。
我严重怀疑缺少用户定义的跳转表会削弱java应用程序的性能。

您可以使用enum来实现这一点

// doesn't work in c#
enum Switch implements Runnable {
   OPTION1() {
     public void run() {
        // do something.
     }
   },
   OPTION2() {
     public void run() {
        // do something.
     }
   },
   OPTION3() {
     public void run() {
        // do something.
     }
   }
}

Switch option = Switch.valueOf(switchOptionTest);
option .run();
//or
Switch[] options = Switch.values();
Switch option = options[nSwitchOption];
option .run();
是的,绝对是

如果您编写一个switch语句,则根据不同的情况,该开关将转换为字节码形式的表开关指令

  • 开关必须依赖于int值
  • 最高int值和最低int值不能相距太远
实现这一点的最简单方法是使用java枚举,它是由编译器专门处理的。相关文档在中。当然,JIT编译器几乎可以肯定地将这些直接转换为运行在任何平台上的机器代码中的非常快的开关


话虽如此,你问题的真正答案是“这是你在编写机器代码时所担心的事情,而不是用高级语言编程“

+1对这个和keysersoze说,/-1对其他人说,因为他们没有意识到OOP是一个分派表的实现!这就像问为什么C没有一个push命令来直接操作堆栈一样。+1:除非有一些非常不寻常的约束,或者解决方案是一次性的,非常非正式/小型的,虚拟调度应该是首选的调度机制。另一个伟大的Google Techtalk可以看到用多态性替换条件(这是Martin Fowler的书——《重构:改进现有代码的设计》中的重构模式)可以在这里找到:完美答案。希望我能+3