Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

陷阱11 不得不防——不可变的整数运算

在Java中对于较大整数值的运算,可以使用BigInteger类来实现,该类代表不可变的任意精度的整数,并且提供了与算术运算对应的方法,可以实现较大整数的运算,如add方法就与算术运算中的加法运算相对应。

注意

在使用BigInteger类进行运算时,并不是改变当前BigInteger类的实例值,比如有两个BigInteger实例x和y,当x调用add方法与y相加时,可以通过语句x. add (y)来实现,但是该语句执行后,程序并没有改变变量x的值,而是整个语句x. add (y)的值才是x加上y的和,这也是很多程序员使用该类容易发生的错误,因为语句x. add (y)并不代表语句x=x+y,而是代表表达式x+y。

示例:

    BigInteger x = new BigInteger ("2500");          // 创建BigInteger对象x,其值是2500
    BigInteger y = new BigInteger ("500");           // 创建BigInteger对象y,其值是500
    x. add (y);                                       // 计算x与y的和
    System. out. println (x);                          // 输出x的值

说明

运行本示例,程序将输出“2500”,这个值并不是x 与y 的和“3000”,因此通过该示例应该明白,当执行语句x. add (y)时并不能改变x的值,因为BigInteger类是不可变的任意精度的整数,所以不能通过语句x. add (y)改变x的值,但是语句x. add (y)返回的值却是x与y的和,因此可以再声明一个BigInteger对象sum,并将语句x. add (y)的返回值赋值给sum,这样,sum的值就是“3000”了。

下面的示例对前一个示例做了改进,使用其能够正确计算出x 与y 的和,并输出它们的和3000。

示例:

    BigInteger x = new BigInteger ("2500");        // 创建BigInteger对象x,其值是2500
    BigInteger y = new BigInteger ("500");         // 创建BigInteger对象y,其值是500
    BigInteger sum =x. add (y);                     // 计算x与y的和并赋值给sum
    System. out. println (sum);                      // 输出sum的值

说明

运行本示例,程序输出了“3000”,这也充分说明了通过x. add (y)可以计算x与y的和,但是并不能改变x的值,因此在使用BigInteger类时一定要特别小心,尤其是用于商业用途时更应小心谨慎,不要试图通过该类来改变自身的值,因为这样的改变会失败,如前一个示例试图改变x的值时并没有成功,因此该类如果使用不当就会造成巨大的损失。