一、享元模式在 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数组,在静态代码块中给数组中赋值。

 

posted on 2021-01-31 17:09  格物致知_Tony  阅读(107)  评论(0编辑  收藏  举报