考虑到内存 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
}
我分享这个不是作为答案。通过阅读字节码,任何人都可以编辑此答案。我在这里补充一点。
- 在第一种方法中,整个过程在 20 步内完成。但在第二
它需要 23 个步骤。
我知道这可能是个愚蠢的问题,但我想知道什么时候才是使用 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
}
我分享这个不是作为答案。通过阅读字节码,任何人都可以编辑此答案。我在这里补充一点。
- 在第一种方法中,整个过程在 20 步内完成。但在第二 它需要 23 个步骤。