【JavaSE】BigDecimal是不可变对象(immutable)
来看这段代码
public void testBigDeciamlAdd(){
BigDecimal amtAlpha = new BigDecimal(0);
BigDecimal tempAmt = new BigDecimal("3.21");
amtAlpha.add(tempAmt);
System.out.println(amtAlpha);// 0
amtAlpha = amtAlpha.add(tempAmt);
System.out.println(amtAlpha);// 3.21
}
为什么打印的不是
3.21
3.21
而是
0
3.21
呢?
因为BigDecimal不是通过final实现的不可变(immutable)对象
来看BigDecimal在java8的源码
private static BigDecimal add(final long xs, int scale1, BigInteger snd, int scale2) {
int rscale = scale1;
long sdiff = (long)rscale - scale2;
boolean sameSigns = (Long.signum(xs) == snd.signum);
BigInteger sum;
if (sdiff < 0) {
int raise = checkScale(xs,-sdiff);
rscale = scale2;
long scaledX = longMultiplyPowerTen(xs, raise);
if (scaledX == INFLATED) {
sum = snd.add(bigMultiplyPowerTen(xs,raise));
} else {
sum = snd.add(scaledX);
}
} else { //if (sdiff > 0) {
int raise = checkScale(snd,sdiff);
snd = bigMultiplyPowerTen(snd,raise);
sum = snd.add(xs);
}
return (sameSigns) ?
new BigDecimal(sum, INFLATED, rscale, 0) :
valueOf(sum, rscale, 0);
}
}
它是return new BigDecimal(sum, INFLATED, rscale, 0)
也就是创建了一个新的对象,而不是直接修改原来的对象
所以add方法没有办法直接修改原对象,必须将加后的对象赋值给原对象才能实现变更

浙公网安备 33010602011771号