Integer 中的缓存类IntegerCache

2014年去某公司笔试的时候遇到这么一道题:

public class Test {
    public static void main(String[] args) {
        Integer int1 = Integer.valueOf("100");
        Integer int2 = Integer.valueOf("100");
        System.out.println(int1 == int2);
    }
}

问打印的结果的多少? 但是我回答的是false, 后来仔细想想应该没有这个简单,就翻了下JDK的源码,发现:

public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }

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

发现里面另有玄机,多了个IntegerCache类:

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            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);
                    // Maximum array size is 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++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

原来Integer把-128到127(可调)的整数都提前实例化了。 这就解释了那道面试题的答案,原来你不管创建多少个这个范围内的Integer用ValueOf出来的都是同一个对象。

但是为什么JDK要这么多此一举呢? 我们仔细想想, 淘宝的商品大多数都是100以内的价格, 一天后台服务器会new多少个这个的Integer, 用了IntegerCache,就减少了new的时间也就提升了效率。同时JDK还提供cache中high值得可配置,

这无疑提高了灵活性,方便对JVM进行优化。

那对于其他类型比如Long和Double之类的呢,清听下回分解。

时间: 2024-08-04 04:15:49

Integer 中的缓存类IntegerCache的相关文章

了解关于Integer的缓存类IntegerCache

今天看了一下Integer的源码: public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10)); } /** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as re

简析Android中LruCache缓存类

/***************************************************  * TODO: description .  * @author: gao_chun  * @since:  2015-4-7  * @version: 1.0.0  * @remark: 转载请注明出处  **************************************************/ 内存缓存技术对那些大量占用应用程序宝贵内存的图片提供了快速访问的方法.其中最核心

【cocos2d-x游戏开发】cocos中的三种缓存类

Cocos中有三种缓存类: (1):纹理缓存:TextureCache (2):精灵帧缓存:SpriteFrameCache (3):动画缓存:AnimationCache 游戏最要重要的就是流畅度,如果我们的游戏经常因为加载资源出现卡顿的情况,那么这个游戏就没有很好地游戏体验.所以,为了解决这个问题,缓存就应运而生了. 缓存的目的就是:现将所需资源加载到内存中,之后再次使用该资源的时候,就可以直接从内存中读出,而不需要重新加载,从而减少了CPU和GPU的内存占用. TextureCache 在

对Integer类中的私有IntegerCache缓存类的一点记录

对Integer类中的私有IntegerCache缓存类的一点记录 // Integer类有内部缓存,存贮着-128 到 127. // 所以,每个使用这些数字的变量都指向同一个缓存数据 // 因此可以直接使用 == 来比较是否相等 Integer a = 88; Integer b = 88; System.out.println(a == b); // true // 下面这个不在Integer缓存类里的数字,在每次赋值的时候都会新建一个对象存放 // 所以,它们不能使用 == 来判断是否相

Java包装类中的缓存机制

本文将介绍Java中Integer的缓存相关知识.这是在Java 5中引入的一个有助于节省内存,提高性能的功能.首先看一个使用Integer的示例代码,从中学习其缓存行为.接着我们将为为什么这么实现以及他到底是如何实现的.你能猜出下面的的Java程序的输出结果吗.如果你的结果和真正结果不一样,那么你就要好好看看本文了. package com.javapapers.java; public class JavaIntegerCache { public static void main(Stri

hibernate中的缓存机制

一.为什么要用Hibernate缓存? Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 二.Hibernate缓存原理是怎样的?Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存. 1.Hibernate一级缓存又称为“Session的缓存”. Sessio

框架开发(六)----缓存类

一 理论补充 缓存是临时开辟出来的一块存放数据的区域, 这样在下一次取数据的时候就可以直接去取了. 因为内存的材质相对于硬盘的读写明显优越性,而且SDRAM等的性价比高,缓存最好保存在内存里.PHP中的缓存主要分两种,逻辑代码层面的缓存和数据层面的缓存.逻辑缓存主要是编译缓存,php 是脚本解析形式的语言,即php 是不转换为机器码的,php在服务器cgi 分配给进程,fastcgi是常住内存的进程,fpm管理cgi的进程调度,有几种IO模式例如Epoll,worker 等.php代码首先被编译

【安卓中的缓存策略系列】安卓缓存策略之磁盘缓存DiskLruCache

安卓中的缓存包括两种情况即内存缓存与磁盘缓存,其中内存缓存主要是使用LruCache这个类,其中内存缓存我在[安卓中的缓存策略系列]安卓缓存策略之内存缓存LruCache中已经进行过详细讲解,如看官还没看过此博客,建议看官先去看一下. 我们知道LruCache可以让我们快速的从内存中获取用户最近使用过的Bitmap,但是我们无法保证最近访问过的Bitmap都能够保存在缓存中,像类似GridView等需要大量数据填充的控件很容易就会用完整个内存缓存.另外,我们的应用可能会被类似打电话等行为而暂停导

【安卓中的缓存策略系列】安卓缓存策略之综合应用ImageLoader实现照片墙的效果

在前面的[安卓缓存策略系列]安卓缓存之内存缓存LruCache和[安卓缓存策略系列]安卓缓存策略之磁盘缓存DiskLruCache这两篇博客中已经将安卓中的缓存策略的理论知识进行过详细讲解,还没看过这两篇博客的看官建议先去看一下,本博客将依据这些理论知识打造一个ImageLoader,实现照片墙的效果,关于照片墙的知识网上相关博客也很多,首先解释一下照片墙的概念:用一个GridView控件当作"墙",然后随着GridView的滚动将一张张照片贴在"墙"上,很显然因为