String常量池 享元模式-设计模式

1 篇文章 0 订阅
1 篇文章 0 订阅

String常量池 享元模式

本文基于java8 内存结构图
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类两种对象实例化的区别:

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
享元设计模式(Flyweight Design Pattern)是一种用于优化大量对象创建和使用的设计模式。在Android开发中,使用享元模式可以有效地减少内存消耗和提高性能。 在享元模式中,对象被分为两种状态:内部状态和外部状态。内部状态是不变的,可以被多个对象共享,而外部状态是可变的,每个对象都有自己的外部状态。 在Android中,典型的例子是使用Bitmap对象来显示图片。当需要显示多个相同的图片时,可以使用享元模式来共享已加载的Bitmap对象,而不是每次都创建新的Bitmap对象。 以下是一个简单的示例代码: ```java public class BitmapFactory { private Map<String, Bitmap> bitmapCache = new HashMap<>(); public Bitmap getBitmap(String path) { Bitmap bitmap = bitmapCache.get(path); if (bitmap == null) { // 如果缓存中没有该Bitmap对象,则创建新的Bitmap对象 bitmap = BitmapFactory.decodeFile(path); bitmapCache.put(path, bitmap); } return bitmap; } } ``` 在上面的示例中,`BitmapFactory` 类使用一个 `bitmapCache` Map 来缓存已加载的 Bitmap 对象。当需要获取 Bitmap 对象时,首先从缓存中查找,如果找到则返回缓存的对象,否则创建新的 Bitmap 对象并存入缓存。 通过使用享元模式,可以避免重复创建相同的 Bitmap 对象,从而减少内存消耗。这在需要频繁加载和显示大量图片的应用中非常有用。 需要注意的是,享元模式适用于有大量相似对象的情况,并且需要权衡共享对象和创建对象的开销。在某些情况下,过度使用享元模式可能会导致代码复杂化,降低可读性和可维护性。因此,在使用享元模式时应根据实际情况进行评估和折衷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值