考虑到内存 IO,在 Java 中使用 If/Else 语句

Use of If/Else Statement in Java considering memory IO

我知道这可能是个愚蠢的问题,但我想知道什么时候才是使用 if/else 语句的正确时机。

假设我们通过以原始 java int 类型给出最大堆大小来构造一个堆。 这是我的构造函数。

public Heap(int maximumSize) {
        this.maximumSize = maximumSize;
        if (maximumSize < 1) {
            this.maximumSize = 100;
        }
        data = new int[this.maximumSize];
}

我也可以这样写

public Heap(int maximumSize) {
        if (maximumSize < 1) {
            this.maximumSize = 100;
        } else {
            this.maximumSize = maximumSize;
        }    
        data = new int[this.maximumSize];
}

我想知道考虑到所有低级进程,哪种方法更有效?

这几天不是很时髦,但是你可以使用三元运算符

将它全部折叠起来
this.maximumSize = maximumSize < 1 ? 100 : maximumSize;

这听起来像 premature optimisation。首先,我们应该担心正确性和可读性,只有在有直接证据(通常通过分析获得)表明相关代码是性能瓶颈时才关注性能。

考虑到这一点,我会写

public Heap() {
    this(100);
}

public Heap(int maximumSize) {
    if (maximumSize < 1) {
        throw new IllegalArgumentException(
            String.format("invalid maximumSize: %d", maximumSize));
    }
    this.maximumSize = maximumSize;
    data = new int[this.maximumSize];
}

拥有两个独立的构造函数背后的想法是消除不直观的 "use a default when maximumSize is zero" 行为。这两个构造函数使默认与非默认行为明确。

根据我对微观层面的理解,方法二是更好的方法,因为方法一遵循以下步骤: 1) 创建一个具有默认值的变量 maximumsize。 2)用传递的参数初始化变量。 3)检查条件。 4)如果为真,则重新初始化它。 同时第二步如下: 1)创建一个具有默认值的变量maximumsize。 2) 检查条件。 3) 初始化最大尺寸。

第一种方法Class:

public class Heap {

        private int maximumSize;

        public Heap(int maximumSize) {
            this.maximumSize = maximumSize;
            if (maximumSize < 1) {
                this.maximumSize = 100;
            }
        }

        public static void main(String[] args) {
            Heap heap = new Heap(10);
        }

}

编译并得到字节码,

rakesh@Rakesh-KR:/media/rakesh/WorkZ$ javap -c Heap
Compiled from "Heap.java"
public class Heap {
  public Heap(int);
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: iload_1       
       6: putfield      #2                  // Field maximumSize:I
       9: iload_1       
      10: iconst_1      
      11: if_icmpge     20
      14: aload_0       
      15: bipush        100
      17: putfield      #2                  // Field maximumSize:I
      20: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #3                  // class Heap
       3: dup           
       4: bipush        10
       6: invokespecial #4                  // Method "<init>":(I)V
       9: astore_1      
      10: return        
}

对于第二种方法;

if (maximumSize < 1) {
      this.maximumSize = 100;
 } else {
      this.maximumSize = maximumSize;
 }

字节码为,

rakesh@Rakesh-KR:/media/rakesh/WorkZ$ javap -c Heap
Compiled from "Heap.java"
public class Heap {
  public Heap(int);
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: iload_1       
       5: iconst_1      
       6: if_icmpge     18
       9: aload_0       
      10: bipush        100
      12: putfield      #2                  // Field maximumSize:I
      15: goto          23
      18: aload_0       
      19: iload_1       
      20: putfield      #2                  // Field maximumSize:I
      23: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #3                  // class Heap
       3: dup           
       4: bipush        10
       6: invokespecial #4                  // Method "<init>":(I)V
       9: astore_1      
      10: return        
}

我分享这个不是作为答案。通过阅读字节码,任何人都可以编辑此答案。我在这里补充一点。

  1. 在第一种方法中,整个过程在 20 步内完成。但在第二 它需要 23 个步骤。