享元模式的作用:运用共享技术来有效地支持大量细粒度对象的复用。
享元模式比较经典的应用就是 JDK 中部分基本类型的包装类,缓存了一定数值范围的对象,valueOf 方法转换为包装对象时,如果值在缓存范围内,即返回缓存对象。
不同版本的 JDK 机制不一样,这里说的是 JDK 8。
为啥 Float、Double 没缓存呢?因为计算机可表示的两个整数之间的浮点数太多太多,无法确定使用频率,缓存没有意义。
以 Integer 为例
public final class Integer extends Number implements Comparable<Integer> {
public static Integer valueOf(int i) {
//在 IntegerCache 中缓存了 [low,high]
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
}
再看一下 Integer 的静态内部类 IntegerCache,在未设置 java.lang.Integer.IntegerCache.high 时,JVM 加载 IntegerCache 类时,静态方法块缓存了 -128 ~ 127;设置了 high 最大值取 127 与 high 中的较大者。
ConstXiong 备案号:苏ICP备16009629号-3