Integer缓存源码剖析

首先先看一个例题,思考一下下面这段程序会出现什么样的结果,由这道题我们对部分源码进行分析:

        Integer a = 100;
        Integer b = 100;
        Integer c = 130;
        Integer d = 130;
        Integer e = new Integer(100);
        Integer f = new Integer(100);
        System.out.println(a==b);
        System.out.println(c==d);
        System.out.println(e==f);        

看完上面的代码,自己的心里面是不是有了自己的答案,最终的答案是(点击+展开查看答案):

true
false
false

我们都知道Integer是int的封装类,通常对于基本数据类型直接赋值给封装类就是自动装箱,这样就会为Integer对象分配对内存,对象呢指向不同的地址,Java中==是比较的对象的地址,因此对于c==d为false我们都很确定,其他两对是什么情况呢???

 1  private static class IntegerCache {
 2         static final int low = -128;
 3         static final int high;
 4         static final Integer cache[];
 5
 6         static {
 7             int h = 127;
 8             String integerCacheHighPropValue =
 9                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
10             if (integerCacheHighPropValue != null) {
11                 try {
12                     int i = parseInt(integerCacheHighPropValue);
13                     i = Math.max(i, 127);
14                     // Maximum array size is Integer.MAX_VALUE
15                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
16                 } catch( NumberFormatException nfe) {
17                     // If the property cannot be parsed into an int, ignore it.
18                 }
19             }
20             high = h;
21
22             cache = new Integer[(high - low) + 1];
23             int j = low;
24             for(int k = 0; k < cache.length; k++)
25                 cache[k] = new Integer(j++);
26
27             // range [-128, 127] must be interned (JLS7 5.1.7)
28             assert IntegerCache.high >= 127;
29         }
30
31         private IntegerCache() {}
32     }

IntegerCache是Integer的静态内部类,该类有一个Integer类型的缓存数组,显示默认会缓存[-128,127]之间的数字,默认实例化256个对象(25行),在-128到127之间呢必须被interned(27行),这些是都是静态并且final的,避免重复的实例化和回收,这样做的目的就是为了节省更大的空间,当一个Integer的值在缓存数组之间时,JVM就会直接把该对象在对象池的地址赋值给引用,因此a==b为true就很清楚了。另外,我们还可以在启动JVM时通过更改java.lang.Integer.IntegerCache.high的值来修改缓存的最大值,如果我们把该值修改为了300,那么缓存数组的范围就是[-128,300]

另外对于显式的创建Integer对象,JVM会直接分配新的空间,不会去对象池中检查是否有该对象,对于e==f为false也就很正常了。

下面演示更改缓存的最大值为300:

首先在run as ——>run Configurations ——>arguments——>VM arguments下配置

-Djava.lang.Integer.IntegerCache.high=300

点击apply,点击run

上面的例题的结果就变为了:

true
true
false

原文地址:https://www.cnblogs.com/javatalk/p/10623124.html

时间: 2024-10-22 22:11:27

Integer缓存源码剖析的相关文章

Spring缓存源码剖析:(二)CacheManager

一.CacheManager总览 如果需要Spring缓存可以正常工作,必须配置一个CacheManager. CacheManager实现类你可以配置Spring-context本身提供的SimpleCacheManager和ConcurrentMapCacheManager等.或者使用RedisCacheManager将缓存内容存放到Redis中.下面类图中RedisCacheManager来自于spring-data-redis  jar包中,AbstractTransactionSupp

《python源码剖析》笔记 python中的List对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.PyListObject对象 --> 变长可变对象,可看作vector<PyObject *> typedef struct{ PyObject_VAR_HEAD //其中的ob_size表示实际被使用的内存的数量 PyObject **ob_item;//ob_item为指向元素列表的指针,实际上,Python中的list[0]就是ob_item[0] int allocat

Jedis cluster集群初始化源码剖析

Jedis cluster集群初始化源码剖析 环境 jar版本: spring-data-redis-1.8.4-RELEASE.jar.jedis-2.9.0.jar 测试环境: Redis 3.2.8,八个集群节点 applicationContext-redis-cluster.xml 配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spri

Phaser实现源码剖析

在这里首先说明一下,由于Phaser在4.3代码里是存在,但并没有被开放出来供使用,但已经被本人大致研究了,因此也一并进行剖析. Phaser是一个可以重复利用的同步栅栏,功能上与CyclicBarrier和CountDownLatch相似,不过提供更加灵活的用法.也就是说,Phaser的同步模型与它们差不多.一般运用的场景是一组线程希望同时到达某个执行点后(先到达的会被阻塞),执行一个指定任务,然后这些线程才被唤醒继续执行其它任务. Phaser一般是定义一个parties数(parties一

【Java集合源码剖析】HashMap源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,

HashMap(2) 源码剖析(推荐)

今天看代码,想到去年发生的HashMap发生的CPU使用率100%的事件,转载下当时看的三个比较不错的博客(非常推荐) 参考:http://coolshell.cn/articles/9606.html   http://github.thinkingbar.com/hashmap-analysis/ http://developer.51cto.com/art/201102/246431.htm 在 Java 集合类中,使用最多的容器类恐怕就是 HashMap 和 ArrayList 了,所以

菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)

Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 31h, 2014 1.哈希表ngx_hash_t的优势和特点 哈希表是一种典型的以空间换取时间的数据结构,在没有冲突的情况下,对任意元素的插入.索引.删除的时间复杂度都是O(1).这样优秀的时间复杂度是通过将元素的key值以hash方法f映射到哈希表中的某一个位置来访问记录来实现的,即键值为key的元素必定存储在哈希

STL 源码剖析 算法 stl_algo.h -- search_n

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search_n ---------------------------------------------------------------------------------------- 描述:在序列[first, last) 所涵盖的区间中,查找"连续 count 个符合条件之元素"所形成的子序列, 并返回迭代器 last 思路: 1.首先找出 value 第一次出现点

python源码剖析笔记1——Python对象初见

python源码剖析笔记1--Python对象初见 工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写,实在耗神.很多东西不用就忘记了,比如C语言,正好,python源码用C写的,分析python源码的同时又能温故C语言基础,实在是件很好的事情.另外,还有陈儒大神的<python源码剖析>做指引,分析也不至于没头没脑.期望在一个月的业余时间,能有所小成,以此为记. 1 python中的对象 python中,一切东西都是对象,在c语言实现