一文详解Java中Integer是如何应用享元模式的

 更新时间:2025年10月23日 08:20:46   作者:软件柠檬  
在Java中,享元模式在Integer和String类中有显著的应用,下面这篇文章主要介绍了Java中Integer是如何应用享元模式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

什么是享元模式?

享元模式(Flyweight Pattern)是一种结构型设计模式,其核心思想是通过共享技术有效地支持大量细粒度对象的复用,从而减少内存中对象的数量,降低系统资源消耗。

享元模式适用于以下场景:

  • 系统中存在大量相似或重复的对象;
  • 这些对象的大部分状态可以外部化(即可以抽离为外部参数);
  • 对象的内部状态(享元对象共享的部分)一旦创建就不改变(通常是不可变的);
  • 应用需要在性能和内存之间取得平衡。

享元模式通常包含以下几个角色:

  • Flyweight(抽象享元类):定义对象的接口,通过参数接受外部状态;
  • ConcreteFlyweight(具体享元类):实现抽象享元接口,内部状态存储在对象内部;
  • UnsharedConcreteFlyweight(非共享享元类):不共享的对象,通常作为组合结构的一部分;
  • FlyweightFactory(享元工厂):创建并管理享元对象,确保共享对象不被重复创建;
  • Client(客户端):维持对享元对象的引用,并计算/传递外部状态。

享元模式的关键在于区分内部状态(共享、不变)和外部状态(由客户端维护、随环境变化)。

Java中Integer是如何应用享元模式的?

Java 中的 Integer 类通过 IntegerCache 实现了享元模式。在 Integer.valueOf(int i) 方法中,对 -128 到 127 范围内的整数进行了缓存:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

这意味着:

✅ 在 -128 到 127 范围内,使用 Integer.valueOf() 或自动装箱时,会返回缓存池中的同一个对象实例:

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true —— 同一个对象引用

❌ 超出该范围时,每次都会创建新对象:

Integer x = 200;
Integer y = 200;
System.out.println(x == y); // false —— 不同对象引用

⚠️ 注意:应使用 .equals() 方法比较值是否相等,而不是 ==(后者比较的是引用)。

该缓存范围可通过 JVM 参数 -XX:AutoBoxCacheMax=N 调整上限(下限固定为 -128)。

这种设计减少了小整数频繁创建对象的开销,是享元模式的经典应用。

享元模式的其他应用?

  1. String 常量池
    Java 中的字符串字面量会被缓存在字符串常量池中,相同的字符串字面量共享同一对象:

    String s1 = "hello";
    String s2 = "hello";
    System.out.println(s1 == s2); // true
    
  2. 数据库连接池 / 线程池
    虽然不完全符合传统享元定义,但思想类似 —— 复用昂贵资源,避免重复创建和销毁。

  3. GUI 系统中的字体、颜色对象
    在图形界面中,相同字体或颜色对象可被多个控件共享,避免重复实例化。

  4. 游戏开发中的粒子系统
    大量相似粒子(如爆炸火花、雨滴)共享纹理、行为等内部状态,位置、速度等作为外部状态传入。

  5. 文本编辑器中的字符对象
    每个字符(如 ‘a’)在文档中可能重复出现成千上万次,享元模式可让所有 ‘a’ 共享同一个字符对象,仅位置、样式等作为外部状态。

  6. Java 中的 BooleanByteShortLongCharacter 缓存
    类似 Integer,这些包装类也对部分值范围做了缓存(如 Boolean 缓存 TRUEFALSECharacter 缓存 0~127)。

✅ 总结:享元模式在需要“大量重复对象 + 内存敏感”的场景中非常有用,是空间换时间的经典优化手段。

到此这篇关于Java中Integer是如何应用享元模式的的文章就介绍到这了,更多相关Java中Integer应用享元模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java stringbuffer的用法示例

    java stringbuffer的用法示例

    这篇文章主要介绍了java stringbuffer的用法示例,字符串缓冲区,是一个容器(当返回到的是String时而且长度不确定,数据类型不确定时就可以用StringBuffer)其实底层还是数组,只是被封装了,对外提供了方法,初始容量为16个字符
    2014-01-01
  • SpringMVC中的HandlerMappingIntrospector工具类详解

    SpringMVC中的HandlerMappingIntrospector工具类详解

    这篇文章主要介绍了SpringMVC中的HandlerMappingIntrospector工具类详解,这是一个Spring MVC助手类,用于集合应用所配置的HandlerMapping(url pattern和请求处理handler之间的映射)表,用于获取针对某个请求的如下信息,需要的朋友可以参考下
    2023-12-12
  • Java for循环性能优化实现解析

    Java for循环性能优化实现解析

    这篇文章主要介绍了Java for循环性能优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • elasticsearch集群发现zendiscovery的Ping机制分析

    elasticsearch集群发现zendiscovery的Ping机制分析

    这篇文章主要为大家介绍了elasticsearch集群发现zendiscovery的Ping机制分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Spring创建BeanDefinition之路径扫描详解

    Spring创建BeanDefinition之路径扫描详解

    这篇文章主要介绍了Spring创建BeanDefinition之路径扫描方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java中的Set、List、Map的用法与区别介绍

    Java中的Set、List、Map的用法与区别介绍

    这篇文章主要介绍了Java中的Set、List、Map的用法与区别,需要的朋友可以参考下
    2016-06-06
  • 基于Java编写一个神奇的代码恢复工具

    基于Java编写一个神奇的代码恢复工具

    这篇文章主要为大家详细介绍了如何基于Java编写一个神奇的代码恢复工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • Nginx启用压缩及开启gzip 压缩的方法

    Nginx启用压缩及开启gzip 压缩的方法

    这篇文章主要介绍了Nginx启用压缩及开启gzip 压缩的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • JDBC连接MySQL数据库批量插入数据过程详解

    JDBC连接MySQL数据库批量插入数据过程详解

    这篇文章主要介绍了JDBC连接MySQL数据库批量插入数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Spring boot文件路径映射配置代码实例

    Spring boot文件路径映射配置代码实例

    这篇文章主要介绍了Spring boot文件路径映射配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06

最新评论