• 第三节:享元模式——源码分析


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

  • 相关阅读:
    冒泡排序算法分析和实现
    选择排序算法分析与实现
    nio和 bio
    TCP三次握手
    IE input X 去掉文本框的叉叉和密码输入框的眼睛图标
    <%#eval() %>和<%#bind() %> 的区别
    <%#Eval() %>的常用方法
    C#(ASP.net)从其他网站抓取内容并截取有用信息
    JQuery写的一个简单的分页插件-2
    简单实用的jQuery分页插件
  • 原文地址:https://www.cnblogs.com/niujifei/p/14353104.html
Copyright © 2020-2023  润新知