Java:if-return-if-return vs if-return-elseif-return

标签 java if-statement micro-optimization

询问 unrelated question我有这样的代码:

public boolean equals(Object obj)
{
    if (this == obj)
        return true;

    if (obj == null)
        return false;

    if (getClass() != obj.getClass())
        return false;

    // Check property values
}

我收到一条评论,声称这不是最优的,而是(如果我理解正确的话)应该这样做:

public boolean equals(Object obj)
{
    if (this == obj)
        return true;

    else if (obj == null)
        return false;

    else if (getClass() != obj.getClass())
        return false;

    // Check property values
}

由于 return 语句,我真的不明白为什么它们中的任何一个应该比另一个更有效或更快。给定一个特定的对象,就我所见,这两种方法都必须进行相同数量的检查。并且由于 return 语句,它们中的任何一个都不会运行额外的代码。

我在这里遗漏了什么吗?有什么关系吗?是否有一些编译器优化或发生了什么?

我知道这是微优化,我很可能会坚持第一种方式,因为我认为所有 if 都在同一位置时看起来更简洁。但我无能为力;我很好奇!

最佳答案

这两种情况生成的字节码是相同的,所以这纯粹是风格问题。

我生成了两个方法 e1e2 并且都生成了这个字节码(使用 javap -v 读取):

public boolean e1(java.lang.Object);
  Code:
   Stack=2, Locals=2, Args_size=2
   0:   aload_0
   1:   aload_1
   2:   if_acmpne   7
   5:   iconst_1
   6:   ireturn
   7:   aload_1
   8:   ifnonnull   13
   11:  iconst_0
   12:  ireturn
   13:  aload_0
   14:  invokevirtual   #25; //Method java/lang/Object.getClass:()Ljava/lang/Class;
   17:  aload_1
   18:  invokevirtual   #25; //Method java/lang/Object.getClass:()Ljava/lang/Class;
   21:  if_acmpeq   26
   24:  iconst_0
   25:  ireturn

我省略了我在之后放置的代码以使其编译。

关于Java:if-return-if-return vs if-return-elseif-return,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5663447/

相关文章:

java - 从 for 循环中的 if 退出 for 循环?

javascript - if 语句中不同的数组长度越界异常

java - 如何让 @ExceptionHandlers 在默认为任何运行时错误的异常处理程序之前处理特定异常?

java - 使用Java登录基于表单的身份验证.NET Web应用程序

Java泛型函数获取JSON

尝试在 jade 中打印容器 id 时出现 java.lang.ClassCastException

javascript - 清理三元语句中的代码

assembly - 无堆栈函数的跳转/跳转编译策略。 (手动使用链接注册而不是调用/返回)

javascript - 动态注入(inject) javascript 文件 - 为什么大多数示例附加到头部?

assembly - x86 汇编中的高效 mod 3