这次我们谈谈JDK的设计
以前用String类的replaceAll的方法的时候, 总是会误以为只要调用了replaceAll方法后, 该String类就是我们想要的结果. 实则不然, 在调用这个方法之后, String实例并没有发生任何改变. 那时的想法是多此一举. 但是最近看java并发实践的时候, 突然想通了.
BigInteger number = new BigInteger("1");
number.add(new BigInteger("1"));
number = 多少?
答案是1. 为何呢, 因为你在调用add方法之后, 相加的操作并不是直接在number上操作的, 而是会新建一个BigInteger的实例. 看源码是很容易就能懂, 但是从设计角度考虑, jdk为何要如此设计呢?
答案是Immutable. 不可变的类有很多好处, 因为不可变类一定是线程安全的. 类似的, String , BigDecimbal也是如此设计的.
那么Integer呢, 仔细去看JDK的Integer源码, 并没有任何可以改变值的方法. 但是别忘了, Jdk会在操作Integer的时候, 进行自动装箱和拆箱. 比如Integer result = Integer(1) + Integer(2). 会变为int 1 + int 2. 然后result呢, 会被装箱成Integer(3). 所以Integer也是符合Immutable的设计的