使用+=运算符的Java最佳实践

17 浏览
0 Comments

使用+=运算符的Java最佳实践

我正在阅读一本名为《Java 8基础入门》的书。然后我看到了这一行代码:\n//一些代码...\nsum = sum + i; //最好使用sum += i\n//更多代码...\n然后我有一个疑问:这是真的吗?为什么最好使用+=运算符?我以为+=运算符只是一个更简化的表达式?如果我使用其中之一,对代码性能有什么影响吗?

0
0 Comments

Java中使用+=运算符的最佳实践

在Java中,使用+=运算符来实现累加操作是一种常见的做法。例如,可以使用sum += i;来将变量i的值累加到变量sum中。然而,有人可能会争论使用+=运算符的风格更好,因为它不太冗余,读者需要做的工作更少,以弄清楚+=的含义,因为不需要在赋值运算符的两边都查找sum。

事实上,"最佳实践"存在的原因不仅仅是为了性能,更重要的是为了代码的可读性和可维护性。不要假设一切都是关于性能的。

然而,在某些涉及隐式转换的特殊情况下使用+=可能会有问题。有一个Java谜题(来自Bloch和Gafter的书),成功地误用了这一点,具体问题可以查看这个链接:查看这个问题

总结起来,使用+=运算符来实现累加操作在Java中是非常常见的做法,但是在某些特殊情况下可能会导致问题。因此,在编写代码时,应该根据具体情况来选择使用+=运算符还是其他方式来实现累加操作。

0
0 Comments

在Java中,有两种不同的运算符+=+。根据Java规范的解释,E1 op= E2等价于E1 = (T) ((E1) op (E2)),其中TE1的类型,除了E1只计算一次。这意味着E1 += E2等价于E1 = (T) (E1 + E2),但E1只计算一次。

因此,对于下面的代码:

int sum = 0;
sum += 1.0; // 这等价于sum = (int) (sum + 1.0);
sum = sum + 1.0; // 这将不能通过编译,因为从double到int的转换会丢失精度

使用+=运算符是可以的,而使用+运算符会导致编译错误,因为从double到int的转换会丢失精度。

这与常识相反,因此在这种情况下更安全地不使用+=运算符。

那么为什么更好地使用+=运算符呢?这是一个很好的问题!通过使用+=运算符,我们可以确保变量的类型不会发生变化,而使用+运算符则可能导致类型不匹配的错误。

参考文献:

[Java's +=, -=, *=, /= compound assignment operators](https://stackoverflow.com/q/8710619/2654518)

0
0 Comments

在这篇文章中,我们将探讨在Java中使用"+="运算符的最佳实践。文章的内容主要集中在两个示例程序的比较和字节码的分析上。

首先我们来看第一个示例程序,代码如下:

public class Program1 {
    public static void main(String []args) {
        int i = 1;
        int sum = 2;
        sum += i;
    }
}

通过使用命令`javap`来查看字节码,我们可以得到以下结果:

public class Program1 {
  public Program1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: istore_1
       8: return
}

接下来我们来看第二个示例程序,代码如下:

public class Program2 {
    public static void main(String []args) {
        int i = 1;
        int sum = 2;
        sum = sum + i;
    }
}

同样使用`javap`命令来查看字节码,我们可以得到以下结果:

public class Program2 {
  public Program2();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: istore_1
       8: return
}

通过观察以上的字节码,我们可以发现两个示例程序的字节码完全相同,这意味着这两个语句是等价的,没有任何区别。

接下来我们来探讨一下不同类型的变量之间使用"+="运算符的情况。对于不同类型的变量,"+="运算符会自动进行类型转换。例如,下面的代码:

long i = 1;
int sum = 2;
sum += i; //等价于 sum = (int)(i + sum)

而对于语句"sum = sum + i"来说,它不会自动进行类型转换,所以这个语句无法通过编译。

我个人倾向于在需要进行类型转换时使用显式的类型转换,这样可以使代码更加易读和安全。

至于为什么书中推荐使用简洁的语法,我们并不确定。原作者并没有提到书中的原因。

如果你使用不同的类型进行实验,例如"int i"和"double sum",你会发现结果是不同的。对于这种情况下的语句"sum = sum + i",会出现类型转换错误的情况。

希望通过这篇文章的讨论,能够对在Java中使用"+="运算符的最佳实践有一个更好的理解。

0