java中常见的不可变对象

断鸿 2019年07月13日 122次浏览

[toc]

  • 不可变对象:指在被创造之后,它的状态就不可以被改变。任何对它的改变都应该产生一个新的对象。如String、基本类型的包装类、BigInteger和BigDecimal等

  • 可变对象:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类

不可变类的优缺点

优点

  • 构造、测试和使用都很简单

  • 不可变对象是线程安全的,在线程之间可以相互共享,不需要利用特殊机制来保证同步问题,因为对象的值无法改变。可以降低并发错误的可能性,因为不需要用一些锁机制等保证内存一致性问题也减少了同步开销。

  • 不可变对象可以被重复使用,可以将它们缓存起来重复使用,就像字符串字面量和整型数字一样。可以使用静态工厂方法来提供类似于valueOf()这样的方法,它可以从缓存中返回一个已经存在的Immutable对象,而不是重新创建一个。

缺点

  • 不可变对象最大的缺点就是创建对象的开销,因为每一步操作都会产生一个新的对象,制造大量垃圾,由于他们不能被重用而且对于它们的使用就是”用“然后”扔“,会创造很多的垃圾,给垃圾收集带来很大的麻烦

容易出问题的地方

    /**
     * 金额的累加
     */
    @Test
    public void test() {
        BigDecimal bigDecimal = BigDecimal.ZERO;
        for (int i = 0; i < 10; i++) {
            bigDecimal.add(BigDecimal.ONE);
        }
        System.out.println(bigDecimal);
    }
		//结合引用传递
    @Test
    public void strTest() {
        String str = "ABC";
        changeStr(str);
        System.out.println(str);
    }

    private void changeStr(String str) {
        String replace = str.replace('B', 'D');
        System.out.println(replace);
    }