【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方法没有办法直接修改原对象,必须将加后的对象赋值给原对象才能实现变更

posted @ 2025-08-06 18:46  onejay  阅读(11)  评论(0)    收藏  举报