您的位置:首页 > 其它

Integer的自动装箱过程

2015-07-22 14:05 633 查看
先来看道题

 int  a=100;

 int  b=100;

 Integer  c=a;

 Integer  d=b;

 System.out.println(a==b);
 System.out.println(c==d);

其实这道题  和  a 与  b 没有什么关系,可以直接看成

  Integer c=100;
  Integer d=100;

System.out.println(c==d); 

执行结果为 true 

 当是如果把题目改为

  Integer c=200;
Integer d=200;

System.out.println(c==d);

执行结果却为false

这是为什么呢?

这就涉及到 Integer  的自动装箱了,

 我们都知道Integer是一个 类 不是基本类型数据,但是为什么它可以直接像基本类型数据一样可以直接赋值.

 这是在jdk1.5  之后引入的 自动装箱和自动拆箱.

 上面的问题实际上是使用了  Integer.valueOf()进行自动装箱的.

 等同于   

Integer c=Integer.valueOf(100);

对于为什么上面两个问题的执行结果会有不同,我们就需要看 Integer.valueOf()的源码了  

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



IntegerCache.high和IntegerCache.low默认分别为    127  和-128

如果传入的值是在-128~127之间就会建立Integer实例并且把实例放入缓存中,

当再传入的值是缓存中存在的,就会把缓存中的实例返回.

如果不在 -128~127之间就不会把 实例放入缓存中.直接返回一个实例.

内容部分参考java jdk7 学习笔记
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: