【多线程:设计模式】享元模式

简介: 【多线程:设计模式】享元模式

【多线程:设计模式】享元模式

01.介绍

保护性拷贝介绍

我之前的一篇文章浅显的模拟过String类 当时是为了探究为什么String类是不可变类型 文章地址在
https://blog.csdn.net/m0_71229547/article/details/125757561?spm=1001.2014.3001.5502
里面重要的结论就是 因为value数组是final修饰的 导致地址引用不可改变 所以Sting类的赋值 或者 获取子类的这种方法 其实都是再新new一个对象 然后返回,所以String类每次操作后返回的对象都是新的对象所以不可变,大家也可以看一下String类的substring方法

可以看出substring方法也是返回一个新的对象,这种通过创建副本对象来避免共享的手段称之为 保护性拷贝

享元模式介绍

保护性拷贝会出现说明问题就是如果对String类操作过多 势必会创建出非常多的对象 很显然是不合适的,所以出现了享元模式 它的使用场景是 当需要重用的数量有限的同一类对象时,例如我们的字符串 假如某个字符串已经有了 我们可以直接用这个字符串对象 而不用再重写创建一个

02.享元模式在常见类中的体现

包装类

在jdk中 Boolean Byte Short Integer Long Character等包装类提供了valueOf()方法 例如Long的valueOf会缓存-128-127之间的Long对象,在这个范围之间会重用对象,大于这个范围,才会新建Long对象

注意

1.Byte Short Long缓存的范围都是-128-127
2.Character缓存的范围是0-127
3.Integer的默认范围是-128-127

   最小值不能变
   但是最大值可以通过调整虚拟机参数 -Djava.lang.Integer.IntergerCache.high来改变

4.Boolean缓存了TRUE和FALSE

String类

String类是我们日常使用中最常用的类 所以它的优化很重要,在JVM中有一个字符串常量池,具体场景是这样

    String a = "ss"; // 如果"ss"还没有创建 就创建 并且缓存到字符串常量池
    String b = "ss"; // 如果创建过了 就从字符串常量池中获取"ss"的地址 并赋值给b

验证1

    public class TestXYMS {  
        public static void main(String[] args) {  
            String a = new String("ss");  
            String b = new String("ss");  
            System.out.println(a == b);  
        }  
    }

结果

false

解释
此时我们都是通过new来创建 并没有从字符串常量池中获取 所以为false

验证2

    public class TestXYMS {  
        public static void main(String[] args) {  
            String a = "ss";  
            String b = "ss";  
            System.out.println(a == b);  
        }  
    }

结果

true

解释
a = "ss" 创建了"ss"对象 并缓存到了常量池,b = "ss" 从常量池中获取

验证3

public class TestXYMS {  
    public static void main(String[] args) {  
        String t = new String("ss");  
        String a = t.intern(); // 从常量池中获取t的值
        String b = "ss";  
        System.out.println(a == b);  
    }  
}

结果

true

解释
new String("ss")后 "ss"缓存到字符串常量池 然后通过t.intern()可以从常量池获取到,通过b = "ss"也可以获取

目录
相关文章
|
1月前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
54 4
|
1月前
|
设计模式 监控 安全
多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)
多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)
73 0
|
1月前
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
1月前
|
设计模式 Java 开发者
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
30 0
|
1月前
|
设计模式 存储 Java
小谈设计模式(27)—享元模式
小谈设计模式(27)—享元模式
|
1月前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
1月前
|
设计模式 存储 安全
【设计模式系列笔记】享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来最小化内存使用或计算开销,以提高性能。该模式适用于需要大量相似对象的场景,通过共享这些相似对象的部分状态,可以有效减少内存消耗。
44 0
|
1月前
|
设计模式 缓存 Java
设计模式之享元模式
设计模式之享元模式
|
1月前
|
设计模式 存储 缓存
聊聊Java设计模式-享元模式
享元(Flyweight)模式:顾名思义就是**被共享的单元**。意图是复用对象,节省内存,提升系统的访问效率。比如在红白机冒险岛游戏中的背景花、草、树木等对象,实际上是可以多次被不同场景所复用共享,也是为什么以前的游戏占用那么小的内存,却让我们感觉地图很大的原因。
21 3
聊聊Java设计模式-享元模式
|
1月前
|
设计模式 存储 缓存
【设计模式】享元模式
【设计模式】享元模式