拆箱和装箱的小知识

来源:互联网 发布:淘宝银座365是正品吗 编辑:程序博客网 时间:2024/05/18 20:04
Integer a1 = 127;
Integer b1 = 127;
if(a1==b1){
    System.out.println("相等");
}else{
    System.out.println("不等");
}
 
Integer a = 128;
Integer b = 128;
if(a==b){
    System.out.println("相等");
}else{
    System.out.println("不等");
}

代码运行结果是:
相等
不等

这段代码网上一搜索就能找出来,但是大家知道原因吗?
Integer包装类型,在java中包装类型和基本类型可以互相转换,引入包装类的概念是为了实现
1.实现基本类型之间的转换 
2.便于函数传值 
3.在一些地方要用到Object的时候方便将基本数据类型装换
但是自动拆箱和装箱有一个问题:
java基本类型的数据和包装类型的数据自动拆箱和装箱的过程中,如果缓存中已经存在值为-128~127之间的数据,再次输入的值和缓存中的数据一致时,可以直接指向这个地址,如果超过了,则会重新创建一个新实例

在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例
如果传入的int在-128和127之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就创建一个Integer实例。

来看一下Integer.valueof()的源代码:
  1. public static Integer valueOf(int i) {  
  2.       assert IntegerCache.high >= 127;  
  3.       if (i >= IntegerCache.low && i <= IntegerCache.high)  
  4.           return IntegerCache.cache[i + (-IntegerCache.low)];  
  5.       return new Integer(i);  
  6.   }  
IntegerCache.low 默认是-128;IntegerCache.high默认是127.
所以就有了上面的代码结果
0 0
原创粉丝点击