本节我们来看一个例子,大家都非常熟悉的对象 Integer 也用到了享元模式,其中暗藏玄机,来看代码。

public static void main(String[] args) {

Integer a = Integer.valueOf(105);

Integer b = 105;

Integer c = Integer.valueOf(1000);

Integer d = 1000;

System.out.println("a==b:" + (a == b));

System.out.println("c==d:" + (c == d));

}

大家猜它的运行结果是什么?在运行完程序后,我们才发现有些不对,得到了一个意想不到的运行结果,如下图所示。

a==b:true

c==d:false

之所以得到这样的结果,是因为 Integer 用到了享元模式,来看 Integer 的源码。

public final class Integer extends Number implements Comparable {

...

public static Integer valueOf(int i) {

assert IntegerCache.high >= 127;

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

...

}

由上可知,Integer 源码中的 valueOf() 方法做了一个条件判断。在通过 valueof 方法创建 Integer 对象的时候,如果目标值在 -128~127 之间,则直接从缓存中取值,返回 IntegerCache.cache 中已经存在的对象的引用,否则新建 Integer 对象。

那么 JDK 为何要这么做呢?因为 -128~127 之间的数据在 int 范围内是使用最频繁的,为了减少频繁创建对象带来的内存消耗,这里就用到了享元模式,以提高性能。

上述例子中 a 和 b 的值为 100,因此会直接从 cache 中取已经存在的对象,所以 a 和 b 指向的是同一个对象,而 c 和 d 是分别指向不同的对象。

同理,Integer、Short、Byte、Character、Long 这几个类的 valueOf 方法的实现是类似的,而 Double、Float 的 valueOf 方法的实现是类似的,因为浮点数在某个范围内的个数不是有限的。

拓展

和 Integer 类似,Long 源码也用到了享元模式,将 -128~127 的值缓存起来,源码如下:

public final class Long extends Number implements Comparable {

public static Long valueOf(long l) {

final int offset = 128;

if (l >= -128 && l <= 127) { // will cache

return LongCache.cache[(int)l + offset];

}

return new Long(l);

}

private static class LongCache {

private LongCache(){}

static final Long cache[] = new Long[-(-128) + 127 + 1];

static {

for(int i = 0; i < cache.length; i++)

cache[i] = new Long(i - 128);

}

}

...

}

同理,Long 中也有缓存,但是不能指定缓存最大值。

java中interger享元模式_Integer中的享元模式相关推荐

  1. Java中的23个设计模式 【结构型模式】 中的 【享元模式】

    文章目录 设计模式分类 享元模式(FlyWeight) 介绍 案例--围棋软件设计 享元模式实现 开发中的应用场景 优缺点 优点 缺点 代码 抽象享元类 具体享元类,设置内部状态 非共享享元类,设置外 ...

  2. 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)

    结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...

  3. 《java与模式》中模式总结

    转自:http://hi.baidu.com/hannick/blog/item/e820d8947d51a541d1135e54.html 设计模式一览表 注:加*的为GoF的23种设计模式. 一. ...

  4. java设计模式 订阅模式_Java中的外观设计模式

    java设计模式 订阅模式 立面是指建筑物的外观. 当穿过街道时,我们所看到的只是建筑物的外观. 该工作面抽象了建筑物的所有复杂实现细节. 同样, 外观设计模式旨在为子系统中的一组接口提供统一的接口. ...

  5. 时空权衡在模式匹配算法中的应用(JAVA)--Horspool算法(简化版BM算法)

    模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串.假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题 ...

  6. java 反应堆模式_Netty中的三种Reactor(反应堆)

    目录: Reactor(反应堆)和Proactor(前摄器) <Java NIO系列教程(八)JDK AIO编程>-- java AIO的proactor模式 Netty的I/O线程Nio ...

  7. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  8. java设计模式迭代器模式_Java中的迭代器设计模式

    java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...

  9. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

  10. 梦魇java_[Java教程]魔鬼的梦魇—验证IE中的JS内存泄露模式(一)

    [Java教程]魔鬼的梦魇-验证IE中的JS内存泄露模式(一) 0 2012-05-08 07:00:04 随着移动互联网的发展,现在越来越多的应用开始想bs方向转移,原来很多复杂的计算逻辑也自然随着 ...

最新文章

  1. MySQL建表枚举分区SQL,【mysql备份】02、Xtrabackup备份mysql
  2. 今晚中科院刘永鑫报告:宏基因组数据分析的机遇与挑战
  3. 怎么在python下载网站内容-分析某网站,并利用python自动登陆该网站,下载网站内容...
  4. Windows Azure 安全最佳实践 - 第 1 部分:深度解析挑战防御对策
  5. Maven项目,项目上出现红叉,项目内没有报错,可以运行
  6. 一文详解pytorch的“动态图”与“自动微分”技术
  7. 多目标分类的混淆矩阵_用于目标检测的混淆矩阵
  8. C++语言第一课的学习
  9. php_memcahed telnet远程操作方法
  10. 当对象转换成JSON的时候处理时间格式
  11. Filecoin网络目前总质押量约为3570万枚FIL
  12. 第十届中软杯(A2行人追踪)!!!
  13. WhatsApp选择了便利而不是隐私,这是解决问题的方法
  14. 放弃高薪的程序员,体制内或许才是最好的归宿
  15. Springboot启动提示:com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILAB
  16. 【JAVA基础】java基础之-泛型详解
  17. 师兄写的一个JAVA播放器的源代码(转)
  18. String截取指定字符前面(后面)所有字符和String的常用方法
  19. MiniGUI学习整理
  20. 百度地图点聚合提高效率

热门文章

  1. [Icehouse][cinder] volume状态为 error_deleting无法删除 的解决方案
  2. 在可部署到brew真机上的程序包构建完之后又要如何将该程序包发布到真机上呢...
  3. android 设为锁屏壁纸,修改设置Android锁屏壁纸为系统默认的锁屏壁纸
  4. java 创建消息队列_java - 在Java中动态创建异步消息队列 - 堆栈内存溢出
  5. 怎么恢复初始状态_长妊娠纹怎么办 产后消除妊娠纹绝招
  6. java8 list统计(求和、最大、最小、平均)
  7. JVM监控及诊断工具GUI篇之Arthas(五):其他指令
  8. dubbo3.0源码编译问题
  9. uploadify上传文件Firefox浏览器上传失败解决方法
  10. C语言 · 字符删除