`

Integer缓存策略

阅读更多
Integer缓存策略

        在 Java 5 中,为 Integer 的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用。
       
        下面代码展示Integer的缓存功能(Integer自动装箱):
public class IntertorTest {
    //Integer自动装箱(Integer a = 2;--会变成Integer a = Integer.valueOf(2);)
    public static void main(String[] args) {
        Integer a = 2;
        Integer b = 2;
        // a=b:true
        System.out.println("a==b:" + (a==b));
        // a.equals(b):true
        System.out.println("a.equals(b):" + a.equals(b));

        Integer c = 200;
        Integer d = 200;
        // c==d:false
        System.out.println("c==d:" + (c==d));
        // c.equals(d):true
        System.out.println("c.equals(d):" + c.equals(d));
        /**
         * Java 中,== 比较的是对象引用,而 equals 比较的是值。
         */
    }

}

public class IntertorTest {
    //使用Integer构造器创建对象。
    public static void main(String[] args) {
        Integer a = new Integer(2);
        Integer b = new Integer(2);
        // a=b:false
        System.out.println("a==b:" + (a==b));
        // a.equals(b):true
        System.out.println("a.equals(b):" + a.equals(b));
    }

}

        上面的规则适用于整数区间 -128 到 +127。这种 Integer 缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。

        IntegerCache---Integer的缓存类
IntegerCache是Integer类中一个私有的静态类。我们先看下源代码。
/**
      * 缓存以支持自动装箱的对象身份语义
      * 根据JLS(java语音规范)要求,-128和127(含)。
      *
      * 缓存在初次使用时初始化。
      * 缓存的大小可以通过{-XX:AutoBoxCacheMax = <size>}选项进行控制最大值。
      * 在VM初始化期间,java.lang.Integer.IntegerCache.high属性
      * 可以设置并保存在私有系统属性中
      * sun.misc.VM类。
      */
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // 高值可能由属性配置
            int h = 127;
            String integerCacheHighPropValue =
                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // 最大数组大小为Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            //范围[-128,127]必须实施(JLS7 5.1.7)
            assert Integer.IntegerCache.high >= 127;
        }

        缓存通过一个for循环实现。从小到大的创建尽可能多的整数并存储在一个名为 cache的整数数组中。这个缓存会在Integer类第一次被使用的时候被初始化出来。以后,就可以使用缓存中包含的实例对象,而不是创建一个新的实例(在自动装箱的情况下)。

        JSL(java语言规范如下):
        如果一个变量 p 的值属于:-128至127之间的整数(§3.10.1),true 和 false的布尔值 (§3.10.3),’u0000′ 至 ‘u007f’ 之间的字符(§3.10.4)中时,将 p 包装成 a 和 b 两个对象时,可以直接使用 a == b 判断 a 和 b 的值是否相等。

        这种缓存行为不仅适用于Integer对象,也适用于其他其他所有的基本类型的包装类型。
        我们针对所有整数类型的类都有类似的缓存机制。 
        有ByteCache用于缓存Byte对象 
        有ShortCache用于缓存Short对象 
        有LongCache用于缓存Long对象 
        有CharacterCache用于缓存Character对象 
        Byte,Short,Long 有固定范围: -128 到 127。对于Character,范围是 0 到 127。除了 Integer 可以通过JVM参数改变范围外,其它的都不行。







分享到:
评论

相关推荐

    浅谈Android LruCache的缓存策略

    在Android开发中,缓存策略对于提升应用性能和用户体验至关重要,尤其是在处理大量数据或资源时。本文主要讨论了Android中的LruCache缓存策略,它是一种高效的内存管理机制,尤其适用于图片或者其他大对象的缓存。 ...

    第7讲 int和Integer有什么区别1

    - 其他包装类的缓存机制:如`Boolean`,`Short`,`Byte`等也有类似的缓存策略,针对它们的特定范围进行优化。 - 原始数据类型与对象的差异:在内存分配、性能、使用场景等方面,原始数据类型和对象有着本质的区别...

    实现 LRU 算法,和 Caffeine 和 Redis 中的缓存淘汰策略.docx

    LRU (Least Recently Used) 算法是一种常用的缓存淘汰策略,它的核心思想是优先淘汰最近最少使用的数据。在计算机系统中,由于内存资源有限,当缓存内容达到最大容量时,必须采取一定的策略来决定哪些数据应该被移除...

    配置EhCache二级缓存

    在此示例中,我们为Dept实体启用了只读(`read-only`)的缓存策略,这意味着缓存中的数据只能被读取而不能修改。这对于单机应用来说是一个很好的选择,因为它能够显著提高查询性能,同时又不会因为并发修改而导致的...

    多级缓存.pdf

    多级缓存是一种高级缓存机制,旨在通过在系统中的不同层级实施缓存策略,来提高整体性能和响应时间。传统缓存策略通常较为单一,比如在收到请求后首先检查Redis缓存,若未命中再查询数据库。这种模式下,Tomcat作为...

    biee 缓存机制文档

    在BIEE中,缓存策略巧妙地平衡了实时数据获取与系统性能之间的关系。 ### 1. 缓存功能 BIEE的缓存机制设计用于存储报表数据,当用户首次访问某个报表时,系统会生成该报表的缓存。此缓存存储在BIEE服务器上,并由...

    学习截图.docx

    这称为"Integer池"或"Integer缓存"。这样做是为了避免频繁的`new Integer()`操作,因为创建新对象会消耗一定的资源。 例如,当我们执行`(Integer)127 == (Integer)127`这样的比较时,两个`Integer`对象实际上是指向...

    echache缓存注解说明文档

    这里,`ehcache.xml`是Ehcache的配置文件,定义了具体的缓存策略和设置。 总的来说,Spring Cache通过注解简化了缓存的管理,使得开发者能更专注于业务逻辑,而不是缓存细节。通过合理使用`@Cacheable`、`@...

    Redis_ServiceStack.net框架优化

    4. **缓存策略**:针对不同业务需求设置不同的缓存策略,如TTL(Time To Live),预热缓存,以及根据访问频率动态调整缓存大小等。 5. **过载保护**:设定合理的速率限制,防止恶意或异常的高访问量导致服务崩溃。...

    更简单的Java缓存框架 jscache.docx

    jscache是一个轻量级、易用的Java缓存框架,它基于面向切面编程(AOP)原理实现,支持灵活配置缓存策略,并提供了多种缓存实现方式。通过使用jscache,开发者能够更加简单高效地管理应用中的缓存数据,提高系统的...

    域策略无法执行处理过程

    - 如果有必要,强制刷新DNS缓存(通过`ipconfig /flushdns`命令)。 #### 三、总结 通过上述步骤,可以有效地排查和解决域策略无法执行的问题。值得注意的是,在实际操作过程中,还需要根据具体的环境和配置情况...

    OBIEE缓存机制

    3. 设置缓存过期策略,如缓存的有效时间或触发清理的条件。 通过这种方式,OBIEE可以根据UET表中的更新记录来自动清理缓存,确保报表数据的准确性和及时性。 #### 四、总结 OBIEE缓存机制对于提高系统的整体性能...

    ios-FBDB数据缓存.zip

    5. **数据缓存策略**:对于数据缓存,开发者可以根据需求制定合适的缓存策略,如LRU(Least Recently Used)或者TTL(Time To Live)。当内存不足或数据过期时,可以清除部分缓存以保持应用性能。 在"FMDB-Demo...

    Hibernate EhCache 二级缓存配置.docx

    3. 在 ehcache.xml 文件中,添加 cache 元素,设置缓存的数据过期策略 ehcache.xml 文件的内容如下: ``` ``` 五、缓存元素的属性 缓存元素的属性包括: * name:设置缓存的名称,它的值是类的完整名称或...

    图片缓存笔记

    - **优化策略**:为了提高图片的加载速度,除了使用高效的缓存策略外,还可以采用以下方法: - 预加载部分图片到缓存中,尤其是首页或高频访问页面的图片。 - 适当降低图片质量或分辨率,以减少下载时间。 - ...

    swift-以模型进行驱动数据缓存

    let sql = "CREATE TABLE IF NOT EXISTS CacheTable (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, content TEXT)" db.executeUpdate(sql, error: nil) } ``` 接下来,我们定义一个缓存服务类,它将负责...

    ECache:将缓存(redis)[烧瓶等]与SQLAlchemy集成

    ECache 在 Flask 应用中作为中间件运行,监听 SQLAlchemy 的查询操作,实现缓存策略。 3. **安装 ECache** 要在项目中使用 ECache,首先需要确保已经安装了 Flask、SQLAlchemy 和 Redis。然后可以通过 pip 安装 ...

    Spring Boot设置并使用缓存的步骤

    ment); } @CacheEvict(value = "departs", key = "#id") public void ...需要注意的是,缓存虽然能提高性能,但也会带来数据一致性的问题,因此在设计缓存策略时,要充分考虑数据的一致性需求和缓存更新策略。

    详解spring cloud hystrix请求缓存(request cache)

    为了充分利用 Hystrix 请求缓存,你需要合理设计缓存策略,确保缓存的键能准确地反映出请求的关键信息,并且在需要时正确清除不必要的缓存。此外,还要注意缓存的生命周期和大小限制,避免缓存溢出或长时间存储不再...

    NewAnsycTask

    在Android开发中,异步处理是一项关键技能,用于提高应用的性能和用户体验。`AsyncTask`是Android SDK提供的一种轻量级的...记住,优化图片处理是Android应用性能提升的重要环节,合理使用异步机制和缓存策略至关重要。

Global site tag (gtag.js) - Google Analytics