Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何';跳转';在Java中调用一个方法而不链接回调用它的位置?_Java_Mips - Fatal编程技术网

如何';跳转';在Java中调用一个方法而不链接回调用它的位置?

如何';跳转';在Java中调用一个方法而不链接回调用它的位置?,java,mips,Java,Mips,我从我的主类中调用一个方法,当满足特定条件时,我用更新的参数调用该方法本身。当我拥有方法调用本身时,我不需要它返回到调用它的位置。换句话说,不需要有方法调用的“堆栈”——每个方法调用都可以取代堆栈上前一个方法的调用 为了让我的观点更清楚,在使用MIPS汇编语言时,我们使用了jump(j)和jump-and-link(jal)。我希望我的方法调用像跳转一样,不必担心返回到调用方。我想这可能会节省一些时间/提高性能 这是我的代码的相关部分: if (temp.contains(names[index

我从我的主类中调用一个方法,当满足特定条件时,我用更新的参数调用该方法本身。当我拥有方法调用本身时,我不需要它返回到调用它的位置。换句话说,不需要有方法调用的“堆栈”——每个方法调用都可以取代堆栈上前一个方法的调用

为了让我的观点更清楚,在使用MIPS汇编语言时,我们使用了jump(j)和jump-and-link(jal)。我希望我的方法调用像跳转一样,不必担心返回到调用方。我想这可能会节省一些时间/提高性能

这是我的代码的相关部分:

if (temp.contains(names[index]))
{
    System.out.println(names[index]);
    if (index < 13)
    {
        index++;
    }
    parse(i, bigLine, index);
}
if(临时包含(名称[索引])
{
System.out.println(名称[索引]);
如果(指数<13)
{
索引++;
}
解析(i,bigLine,index);
}

这个条件块在我的parse方法中,我从自身调用parse,但我不希望它返回给调用方。如果您有任何关于如何做到这一点的想法,我将不胜感激

如前所述,这在Java中是不可能的。您没有goto,所以您唯一的可能性是进行方法调用,而这就是堆栈发挥作用的地方

但别担心,您的“我认为这可能会提高性能”猜测也是完全错误的。在Java中,我们以正确的方式进行优化:分析性能、识别瓶颈并移除或绕过这些瓶颈。这样你就不必“弄明白”任何事情,你会有冷酷的事实来证明你需要做什么


我建议,如果您打算继续使用Java,不要尝试将其他编程语言投射到Java上。汇编语言的情况尤其如此,尽管您可能希望使用字节码本身,如果您希望达到如此低的级别。

这就是所谓的尾部递归优化,不,Java不支持它。其他JVM语言(如Scala)也可以,但在普通Java中,如果需要这种优化,则需要手动进行,使用迭代而不是递归。在您的情况下,它看起来像:

while (index < 13 && temp.contains(names[index])) {
    System.out.println(names[index]);
    i++;
}
while(索引<13&&temp.contains(名称[索引]){
System.out.println(名称[索引]);
i++;
}

对我来说,这似乎是过早的优化。。。如果这是可能的,我认为这是不可能的(至少不是没有一些诡计),如果你试图做这种优化,你会从一种完全不同的编程语言中获得更好的性能。您可以创建一个条件并使用“return”或break;不过,我相信有些人会考虑这种糟糕的编程实践。我想你会发现,在更高级的语言中,由于给定函数调用的开销,这将是非常微不足道的。理论上,JIT编译器可以为你执行这种优化。如果我读对了,是的,一个好的JIT将消除这里的尾部调用。