String常量池 享元模式

本文基于java8 内存结构图

参考:

Java三大特殊类之----String类

Java设计模式之享元模式

String

String 类是由 final 修饰的类 , 不可以被改变 (继承)

java中创建字符串的方式有几种? 区别所占用的空间不同

  1. String abc = “haha”; 内容处于堆中中的常量池
  2. String str = new String(“abc”); 内容处于堆中

String 类的常用构造器:

  1. new String();
  2. new String(byte[] b); 处理 byte数组
  3. new String(String original); 处理原生的字符串
  4. new String(char[] c); 处理char类型的数组
  5. new String(byte[] bytes, String charsetName); 可以指定字符串输出的字符集

new String() 动作

  1. 构建一个实例对象
  2. 在堆内存中开辟另一个空间
  3. 返回一个对象的引用给变量名

设计模式-享元模式

  1. 享元模式(享元模式)也叫蝇量模式:利用共享技术有效地支持大量细粒度的对象
  2. 常用于系统相关开发,解决系统的性能问题。 像数据库连接池,里面都是创建好的连接对象,在这些连接对象有我们需要的则直接拿来用,避免重新创建,如果没有我们需要,则创建一个。
  3. 享元模式能够解决重复对象的内存浪费问题,当系统大量类似对象,需要缓冲池时。不需要总是创建对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。
  4. 享元模式经典的应用场景就是池技术了,字符串恒池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式元模式是池技术的重要实现方式。

享元模式的注意事项和细节

  1. 在享元模式这样理解,“享”就表示共享,“元”表示对象。
  2. 系统中有大量对象,这些对象消耗大量内存,并且对象的状态大部分可以外部化时,我们就可以考虑选用享元模式。
  3. 用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象,用HashMap/HashTable存储。
  4. 享元模式大大减少了对象的创建,降低了程序内存的占用,提高效率
  5. 享元模式提高了系统的复杂度。需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变,这是我们使用享元模式需要注意的地方。
  6. 使用享元模式时,注意划分内部状态和外部状态,并且需要有一个工厂类加以控制。
  7. 享元模式经典的应用场景是需要缓冲池的场景,比如String常量池、数据库连接池。

String 常量池

String 常量池使用到了享元设计模式的思想,

特殊的是:String 常量池是可以扩容的

JVM 底层实际上会自动维护一个对象池(字符串对象池,对象数组),目的就是减少开销

前提条件一样是当你声明了一个变量且想要让这个变量成为一个 String 类对象的引用时,

  1. 若是静态赋值,String 类优先从常量池中寻找对象
    若是找到,那么直接将这个对象的地址返回变量;
    没找到就在常量池创建对象,然后再将这个对象的地址返回变量。
    所以 String 类的静态赋值的对象地址永远在常量池中

  2. 若是 new 语句赋值,
    使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间。除了这一缺点之外,也会对字符串共享产生问题
    在 String 类中提供有方法入池操作 public String intern() ;

总结String类两种对象实例化的区别:

直接赋值: 只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用
构造方法: 会开辟两块堆内存空间,其中一块称为垃圾空间,不会自动保存在对象池中,可以使用 Intern() 方法手工入池

String常量池 享元模式-设计模式相关推荐

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

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

  2. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  "享"取"共享"之意,"元"取"单元"之意. 意图 运用共享技术,有效的支持大量细粒度 ...

  3. 享元模式在JDK源码中的应用——Java设计模式系列学习笔记

    1. String中的享元模式 Java中将String类定义为final(不可改变的),JVM中字符串一般保存在字符串常量池中,java会确保一个字符串在常量池中只有一个拷贝,这个字符串常量池在JD ...

  4. 享元模式在 Java String 中的应用

    享元模式在 Java String 类中的应用.同样,我们还是先来看一段代码,你觉得这段代码输出的结果是什么呢? String s1 = "小争哥"; String s2 = &q ...

  5. 设计模式八(享元模式)

    享元模式 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...

  6. 组合模式 桥接模式 java_java设计模式5.组合模式、门面模式、享元模式、桥接模式...

    组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...

  7. 七、享元模式与门面模式详解

    10.享元模式 10.1.课程目标 1.掌握享元模式和组合模式的应用场景. 2.了解享元模式的内部状态和外部状态. 3.掌握组合模式的透明写法和安全写法. 4.享元模式和组合模式的的优缺点. 10.2 ...

  8. 享元模式(Flyweight模式)

    在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域 ...

  9. 结构型设计模式(五) 之 享元模式是池技术的表现

    1 定义 享元模式(Flyweight Pattern)属于结构型设计模式之一,它主要是使用共享对象有效地避免了创建过多的性质相近的对象,从而降低内存的占用,提高程序的性能.它也是池技术的重要实现方式 ...

最新文章

  1. C++加线程锁详解篇
  2. 剑指offer:表示数值的字符串
  3. NIO框架之MINA详解
  4. [云炬创业基础笔记]第七张创业资源测试14
  5. android studio 项目迁移 gradle 不对导致的卡住解决方法
  6. 20个常用的正则表达式
  7. 微软老兵 Antoine LeBlond 将正式离职
  8. mysql 冗余外键 同步_由于外键约束导致mysql同步出问题的故障
  9. mac破解wifi密码
  10. freeswitch订阅会议相关通知
  11. NTFS for Mac支持Mac拷贝文件到硬盘
  12. python之os.listdir
  13. python执行方式及变量
  14. sap idoc java_如何使用IDOC从SAP系统获取数据
  15. 硬件与分析-音速小子
  16. 35.伪造请求超时的ICMP数据包
  17. 复数,实数,幂函数,指数函数
  18. [WebGL入门]二十一,从平行光源发出的光
  19. 桐桐的新闻系统【模拟】
  20. 《简约至上:交互设计四策略》导读

热门文章

  1. jquery 回到顶部动画
  2. Spark SQL执行流程解析之 sql执行顺序
  3. 手机第二个微信怎么弄 手机如何弄两个微信 手机弄两个微信方法
  4. 小程序开发之影分身术
  5. 连续时间动态主题模型(Continuous Time Dynamic Topic Models, cDTM)
  6. 鸿蒙系统为什么迟迟不上市,鸿蒙系统怎么样? 鸿蒙系统华为什么时候上市?...
  7. 自然语言处理5 -- 词向量
  8. KVM创建快照失败 “Operation not supported: internal snapshots of a VM with pflash based firmware
  9. layer ajax 输入框,layui几种常用输入框
  10. vi/vim的常用快捷键