享元模式在 Java String 类中的应用。同样,我们还是先来看一段代码,你觉得这段代码输出的结果是什么呢?


String s1 = "小争哥";
String s2 = "小争哥";
String s3 = new String("小争哥");System.out.println(s1 == s2);
System.out.println(s1 == s3);

上面代码的运行结果是:一个 true,一个 false。跟 Integer 类的设计思路相似,String 类利用享元模式来复用相同的字符串常量(也就是代码中的“小争哥”)。JVM 会专门开辟一块存储区来存储字符串常量,这块存储区叫作“字符串常量池”。上面代码对应的内存存储结构如下所示:

不过,String 类的享元模式的设计,跟 Integer 类稍微有些不同。Integer 类中要共享的对象,是在类加载的时候,就集中一次性创建好的。但是,对于字符串来说,我们没法事先知道要共享哪些字符串常量,所以没办法事先创建好,只能在某个字符串常量第一次被用到的时候,存储到常量池中,当之后再用到的时候,直接引用常量池中已经存在的即可,就不需要再重新创建了

总结

  • Java String类用到了享元模式

思考

  • python中用到享元模式了么?

来源

55 | 享元模式(下):剖析享元模式在Java Integer、String中的应用

享元模式在 Java String 中的应用相关推荐

  1. 享元模式在 Java Integer 中的应用

    我们先来看下面这样一段代码.你可以先思考下,这段代码会输出什么样的结果. Integer i1 = 56; Integer i2 = 56; Integer i3 = 129; Integer i4 ...

  2. 享元模式-Flyweight(Java实现)

    享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...

  3. 享元模式(Java)

    下面是关于我所写的所有设计模式代码(还是建议自己手打或者想一个别的例子练习一次) (https://github.com/lihang212010/DesignPatterns-/tree/maste ...

  4. 享元模式在文本编辑器中的应用

    如何利用享元模式来优化文本编辑器的内存占用? 你可以把这里提到的文本编辑器想象成 Office 的 Word.不过,为了简化需求背景,我们假设这个文本编辑器只实现了文字编辑功能,不包含图片.表格等复杂 ...

  5. 设计模式-04.02-结构型设计模式-门面模式组合模式享元模式

    文章目录 门面模式(外观模式)[不常用] 门面模式的原理与实现 Demo案例-影院管理 传统方案 门面模式代码 TheaterLight Stereo Screen Projector Popcorn ...

  6. 23种设计模式之享元模式

    享元模式的定义 定义: 使用共享对象可有效的支持大量的细粒度的对象 通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果 上面定义中要求细粒度对象, 那么不可避免的使得对象数量多 ...

  7. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  8. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  9. JAVA设计模式--享元模式

    目录 一.什么是享元模式 二.享元模式在Java中的典型应用 三.享元模式的结构 单纯享元模式 复合享元模式 四.享元模式应用举例 五.享元模式的适用性 六.享元模式的特点 七.总结 一.什么是享元模 ...

最新文章

  1. 在Ubuntu 14.04 64位上使用libpcap进行抓包和解包
  2. Yii学习笔记【2】
  3. PHP explode() 函数
  4. centos6 安装 mantisbt-1.2.8 —— (4)在CentOS6.4中安装配置LAMP环境
  5. vue router获取整条路径参数
  6. Cocos2d-x3.1FileUtilsTest使用
  7. 啊哈算法-游戏币问题(dp)
  8. jquery操作滚动条滚动到指定位置
  9. 4.28考试总结(下午)
  10. 佳能G1810G2810G1800G2800G3800 废墨 手动清零方法
  11. CCNA中文版完整教程
  12. MapGIS Mobile开发
  13. 中标麒麟Neokylin7桌面版安装指南——基于VirtualBox虚拟机
  14. 怎么清除U盘病毒的简单步骤
  15. 苹果产品中投影的秘密在这里
  16. 申宝证券-A股市场的普涨
  17. mysql笔记(一):Navicat for MySQL远程连接mysql服务报错的解决方法(1130、2509)
  18. Symantec赛门铁克强制型SSL服务器证书_网站安全SSL数字证书
  19. 基于SSM的图书馆座位预约管理系统
  20. 字节跳动疯狂扩张:IPO前的最后一战

热门文章

  1. 深度学习自学(十五):人脸识别数据预处理方法
  2. vant在cell中加表格_在vant 中使用cell组件 定义图标该图片和位置操作
  3. 独立的定义有多重等价表述方式
  4. MySQL数据库查询重复数据办法
  5. Java基础教程【第三章:Java运算符】
  6. win7下如何删除不需要的windows服务
  7. dma和通道的区别_Java中IO和NIO的本质和区别
  8. C++两个函数可以相互递归吗_C语言“最难啃”的三块硬骨头!你知道吗?
  9. idea解决代码冲突与乱码
  10. springboot2.0 配置自定义提示功能依赖