一、享元模式在 JDK-Integer的应用源码分析
1、Integer 中的享元模式
2、代码分析
先来看下面一个案例:
1 public class FlyWeight {
2 public static void main(String[] args) {
3
4 // 如果 Integer.valueOf(x) x 在-128~127之间,直接返回,就是使用享元模式返回
5 //如果不在这个范围之内,则仍然 new 然后返回
6
7 /**
8 * 1、在 valueOf 方法中,先判断是否在 IntegerCache 数组中,
9 * 如果不在,就创建新的一个 Integer 对象,
10 * 否则就直接从 cache(缓冲池)中返回
11 * 2、valueOf 方法就使用到 享元模式
12 * 3、如果使用valueOf 方法得到一个 Integer 实例,范围到-128~127,执行速度比new 快
13 */
14
15 Integer x = Integer.valueOf(127);
16 Integer y = new Integer(127);
17 Integer z = Integer.valueOf(127);
18 Integer w = new Integer(127);
19 System.out.println(x.equals(y)); // ? true
20 System.out.println(x == y); // ? false
21 System.out.println(x == z); // ? true
22 System.out.println(w == x); // ? false
23 System.out.println(w == y); // false
24
25 Integer x1 = Integer.valueOf(200);
26 Integer x2 = Integer.valueOf(200);
27 System.out.println(x1 == x2); // false
28 }
29
30 }
3、源码分析:
我们来看一下 Integer.valueOf() 方法:
可以看出,只要给定的 i 在 low-high 的范围内,就会从一个 IntegerCache中获取一个 Integer 对象,否则将新创建一个并返回。
可以看出 IntegerCache 是 Integer 中的一个内部类,在内部声明了一个 Integer数组,在静态代码块中给数组中赋值。