考虑内存IO的Java中If/Else语句的使用

考虑内存IO的Java中If/Else语句的使用,java,if-statement,memory-management,Java,If Statement,Memory Management,我知道这可能是个愚蠢的问题,但我想知道什么时候是使用if/else语句的正确时机 假设我们通过在原始java int类型中指定最大堆大小来构造堆。 这是我的构造函数 public Heap(int maximumSize) { this.maximumSize = maximumSize; if (maximumSize < 1) { this.maximumSize = 100; } data = n

我知道这可能是个愚蠢的问题,但我想知道什么时候是使用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;
这听起来像。在第一种情况下,我们应该担心正确性和可读性,只有当有直接证据(通常通过分析获得)表明所讨论的代码是性能瓶颈时,才关注性能

考虑到这一点,我会写

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];
}

拥有两个单独的构造函数背后的想法是,当maximumSize为零时,消除不直观的使用默认值。两个构造函数使默认与非默认行为显式化。

根据我对微观层次的理解,方法二是更好的方法,因为方法一遵循以下步骤: 1使用默认值创建变量maximumsize。 2使用传递的参数初始化变量。 3检查状况。 4如果为真,则重新初始化它。 同时,步骤2遵循以下步骤: 1使用默认值创建变量maximumsize。 2.检查考虑因素。 3初始化最大大小。

第一个方法类:

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        
}
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        
}
第二种方法

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: 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        
}
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        
}
我分享这一点,并不是作为一个答案。通过读取字节码,任何人都可以编辑此答案。我在这里补充了一点

在第一种方法中,整个过程分20步完成。但在第二 它需要23个步骤。
没关系。这种微观优化毫无意义。写一篇可读性最好的文章;那是主观的。我投1票。我更担心的是,你允许maximumSize为负数或为零。这有意义吗?检查您的前提条件。使用工具显示为每个代码生成的字节码低级指令,并搜索这些指令的实际成本。@Mephy您能告诉我该工具的名称吗?很有可能,编译器将为两个片段生成相同的代码。就我个人而言,如果MaximumSize<1,我会投赞成票抛出新的IllegalArgumentException大小必须大于0;this.maximumSize=maximumSize;这当然是正确的,但实际上并没有回答这个问题,这个问题要求对这两段代码进行性能分析。