欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有关IntegerCache 和 == 的那点小事 博客分类: java javaIntegerCache自动装箱 

程序员文章站 2024-03-15 12:01:53
...

       如果你能很确定说出以下五个等式的结果,那么请绕行,稍有疑惑,那么这片博文将为你解开迷惑。

 (以下测试是在 JDK1.7下进行的)

public class IntegerCacheTest {

	public static void main(String[] args) { 
		
		int a = 1;
		Integer b1 = 1;
		Integer b2 = 1;
		Integer c1 = new Integer(1);
		Integer c2 = new Integer(1);
		Integer d1 = 128;
		Integer d2 = 128;
		
		System.out.println("a == b1 :" + (a == b1)); // true 
		System.out.println("b1 == b2: " + (b1 == b2));  // true
		System.out.println("b1 == c1: " + (b1 == c1)); // false 
		System.out.println("c1 == c2: " + (c1 == c2)); // false
		System.out.println("d1 == d2: " + (d1 == d2)); // false
	} 
}

 

 

 

1.  a == b1  (int == Integer ) 的问题:

       大家都知道java中 int  可以自动装箱为 Integer,而Integer 又可以自动拆箱为 int。  那么当 int  和 Integer 做== 时是怎样做的啦。 这时Integer 会自动拆箱为 int(调用 Integer.intValue() 方法), 然后两个 int 做 == 操作, 自然比较是值,so,结果是 true。 

 

2   Integer b1 = 1,Integer b2 = 1; 解析

     Integer 是一个类,Integer b1 = 1;时,会将等号右边的 1 自动装箱为 一个Integer对象(调用 Integer.valueOf(int)方法)。 当两个类的实例做 == 操作时,比较的是引用的地址。那结果为什么又是false?。就在valueOf() 时出了点猫腻。 IntegerCache(缓存),没错,Integer 类在加载时就new好了[-128,127] 的Integer对象,并存储到缓存中。当调用valueOf时先从缓存中找找, 如果没有就new Integer 返回,如果有就直接从缓存中返回。 两次都是从缓存中返回的 Integer(1)对象,两个引用的地址自然相同。这就是为什么 结果为true的根本所在。

 

3 Integer b1 = 1; Integer c1 = new Integer(1);
     b1 是缓存中的对象,是在Integer加载时初始化的, c1 是直接在堆中创建了。 == 自然就为false了。 

 

4 Integer c1 = new Integer(1);  Integer c2 = new Integer(1);
    这个就不解释了吧, 都直接使用 new 关键在堆中创建了对象, == 比较的是引用,自然结果就为 false了。

 

5   Integer d1 = 128; Integer d2 = 128;

    为什么在(2)中 的结果为 true, 这里为什么就为false了,原因就在于 这里是 128, IntegerCache 默认的范围为[-128,-127]。当值大于127或者小于-128在自动装箱时会 new Integer对象并返回 ,so ,两次赋值都new 了一个新的对象,因此 == 比较的是引用,结果自然为 false了。

 

有关  IntegerCache

      IntegerCache 是 java.lang.Integer 的内部类。在 Integer加载时 会从 系统参数用 读取 java.lang.Integer.IntegerCache,high 参数, 也就是IntegerCache缓存的上线, 但是只有当大于127时有效, 下线时 -128,是直接指定的,不能通过修改系统参数来改变。 同样 Long 也存在着缓存。但是其大小不能改变。

 

 

 

ps:

       刚毕业就想写写博文,但不知道以怎样的话题开始写自己的第一篇博文。偶尔看到这个问题,感觉蛮有趣,因此写篇博文记录下,做一个简单的开始。