首先来看一段代码:

public class ShareTest {public static void main(String[] args) {Integer a = 127;Integer b = 127;System.out.println(a==b);Integer c = 128;Integer d = 128;System.out.println(c==d);}
}

运行结果为:true false

为什么会出现这种情况呢?我们来从源代码中分析一下,首先Integer a = 127这行代码调用的是Integer中的valueOf方法,我们来看看这个方法的源码:

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);
}

其中IntegerCache就是Integer中的一个内部类,从这段代码中我们可以看出,当我的参数i的范围在low和high之间时,会直接返回这个内部类中的一个数组中对应的值,否则会创建一个新的对象。

那么我们再来看你看这个数组是怎么创建的:

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {}
}

由这段代码我们可以知道,这个内部类在初始化的时候创建了一个数组,并且这个数组的长度为 (high-low+1),然后遍历循环,创建了从-128到127这256个Integer对象,并将它们放入到这个数组中。

另外,推荐大家关注微信公众号:Java技术栈,在后台回复:设计模式,可以获取我整理的 N 篇最新设计模式教程,都是干货。

所以当我们在调用valueOf的时候,如果值得范围是在128到127之间,那么是不会创建新的对象的,但是如果超过了这个范围,那么就会创建姓的对象。这就是之前代码运行结果的原因。

到了这里,享元模式的核心思想已经渐渐清晰了,其实就是将一些常用的对象缓存起来,在使用的时候直接拿过来使用,不必创建新的对象,这个省去了创建对象时消耗的资源,也省去了GC在回收这些垃对象时消耗的资源。

在我们日常开发中,享元模式还是比较常见的,最典型的就是池技术,例如服务器的线程池,JDBC的连接池,这些都是享元模式的很好的体现,当然,常量池也是享元模式思想。

作者:Mazin

https://my.oschina.net/u/3441184/blog/886337

Java中的享元设计模式,涨姿势了!相关推荐

  1. Java设计模式(十八):享元设计模式

    1. 应用场景 当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空 ...

  2. java设计模式之享元设计模式

    一.构成 单纯享元模式 抽象享元角色:定义了公共的接口,所有的具体享元角色需要实现的接口,那些需要外蕴状态的操作可以通过方法的参数传入. 具体享元角色:实现抽线享元角色所规定的公共接口,如果有内蕴状态 ...

  3. Integer注意_享元设计模式

    public class IntegerNote{ public static void main(String[] args){   Integer d1=100;   Integer d2=100 ...

  4. 结构设计模式 - Flyweight设计模式(享元设计模式)

    结构设计模式 - Flyweight设计模式 今天我们将研究Flyweight 设计模式,Flyweight设计模式又被称为 享元设计模式 . 目录[ 隐藏 ] 1 Flyweight设计模式 1.1 ...

  5. 黑马程序员--高新技术--静态导入,基本数据类型拆箱与装箱,享元设计模式

    静态导入 import语句可以导入一个类或某个包中的所有类 import static语句导入一个类中的某个静态方法或所有静态方法或静态变量 使用静态导入可以使被导入类的静态变量和静态方法在当前类直接 ...

  6. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  7. 笔记:Java中的单例设计模式

    之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...

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

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

  9. 设计模式之——享元设计模式

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...

最新文章

  1. 升降压斩波电路matlab,升降压斩波电路matlab仿真.doc
  2. 基于SSH实现的农家乐管理系统
  3. Flink+Hologres助力伊的家电商平台建设新一代实时数仓
  4. SpringMvc 注解 @InitBinder 表单多对象精准绑定接收
  5. java中10个用户注册_JavaWeb(十)Session
  6. iOS开发,更改状态栏(StatusBar)文字颜色为白色
  7. Android---------------Handler的学习
  8. 批量裁剪或延伸的lisp程序_10 行 Python 代码,批量压缩图片 500 张,简直太强大了...
  9. paip.提升安全性-------生成一个安全的验证码
  10. SHA256算法原理及其实现
  11. python数据分析和数据可视化总结
  12. 最小生成树详细讲解(Prime算法+Kruskalsuanfa)
  13. msyql创建数据库并指定字符集
  14. apache启动失败原因
  15. 我是如何来进行项目管理-时间管理的
  16. KEL安装和初步研究
  17. django创建app的命令
  18. MapReduce论文中文版--The Google File System
  19. 这才不是我想看的《时间简史》
  20. 计算机通过网线连接不到网络,电脑有网线连不上网怎么解决

热门文章

  1. 编程之美-电话号码对应英文单词方法整理
  2. EMF+GEF的属性页问题
  3. java 使用webmagic 爬虫框架爬取博客园数据
  4. map.js的编写(js编写一个对象的方式)
  5. 修改DEDECMS文章标题长度,解决DEDECMS文章标题显示不全
  6. pthread-win32 semaphore信号量总结
  7. HTML5新特性之WebRTC
  8. C++中int与string的相互转换
  9. memcached企业面试题
  10. PCL点云库学习(1):环境配置(Ubuntu16.04+QT5+VTK8.0)