繁体   English   中英

if-else 和 if only when 方法有 return 语句 - 它们相同吗?

[英]if-else and if only when method has return statement - are they same?

private Object methodName(){
    if(cond) {
      return x;
    }
    return null;
}

private Object methodName(){
    if(cond) {
      return x;
    } else {
      return null;
    }
}

出于好奇,我得到了这个问题。 我最初以第二种方式编写代码。 然后当我再次查看它时,我将其更改为第一种方式,因为两者都满足我的需求。

JVM 处理的方式真的有什么不同吗? 我理解 if 和 else, if then 后跟语句的用例。 我只想知道提到的“返回某些东西”的情况。

大量方法调用的时间复杂度是否相同?

让我们看看字节码,好吗? 我写了一个包含 3 个方法的类,一个带有 if-else,一个带有 if-only,一个带有三元运算符(第四个方法rand()只不过是获取随机真/假值的助手):

// class version 55.0 (55)
// access flags 0x21
public class com.stackoverflow/Ifs {

  // compiled from: Ifs.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 5 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom.stackoverflow/Ifs; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public ifElse()Ljava/lang/String;
   L0
    LINENUMBER 7 L0
    INVOKESTATIC com.stackoverflow/Ifs.rand ()Z
    IFEQ L1
   L2
    LINENUMBER 8 L2
    LDC "result"
    ARETURN
   L1
    LINENUMBER 10 L1
   FRAME SAME
    ACONST_NULL
    ARETURN
   L3
    LOCALVARIABLE this Lcom.stackoverflow/Ifs; L0 L3 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public ifOnly()Ljava/lang/String;
   L0
    LINENUMBER 15 L0
    INVOKESTATIC com.stackoverflow/Ifs.rand ()Z
    IFEQ L1
   L2
    LINENUMBER 16 L2
    LDC "result"
    ARETURN
   L1
    LINENUMBER 19 L1
   FRAME SAME
    ACONST_NULL
    ARETURN
   L3
    LOCALVARIABLE this Lcom.stackoverflow/Ifs; L0 L3 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public ternary()Ljava/lang/String;
   L0
    LINENUMBER 23 L0
    INVOKESTATIC com.stackoverflow/Ifs.rand ()Z
    IFEQ L1
   L2
    LINENUMBER 24 L2
    LDC "result"
    GOTO L3
   L1
    LINENUMBER 25 L1
   FRAME SAME
    ACONST_NULL
   L3
    LINENUMBER 23 L3
   FRAME SAME1 java/lang/String
    ARETURN
   L4
    LOCALVARIABLE this Lcom.stackoverflow/Ifs; L0 L4 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0xA
  private static rand()Z
   L0
    LINENUMBER 29 L0
    INVOKESTATIC java/util/concurrent/ThreadLocalRandom.current ()Ljava/util/concurrent/ThreadLocalRandom;
    INVOKEVIRTUAL java/util/concurrent/ThreadLocalRandom.nextBoolean ()Z
    IRETURN
    MAXSTACK = 1
    MAXLOCALS = 0
}

如果您对未编译的 Java 代码感兴趣,请参考:

public class Ifs {
    public String ifElse() {
        if (rand()) {
            return "result";
        } else {
            return null;
        }
    }

    public String ifOnly() {
        if (rand()) {
            return "result";
        }

        return null;
    }

    public String ternary() {
        return rand()
                ? "result"
                : null;
    }

    private static boolean rand() {
        return ThreadLocalRandom.current().nextBoolean();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM