Java中的AutoBoxing与AutoUnboxing
原创作品,转载请注明出自xelz's blog
博客地址:http://mingcn.cnblogs.com/
本文地址:http://mingcn.cnblogs.com/archive/2010/10/20/JavaAutoBoxing.html
Java中基本数据类型(值类型)只有8种:
boolean,byte,char,short,int,long,float,double
在声明的时候,JVM会在栈(Stack)中分配一定的空间,里面用于存放数据对象的值
而引用数据类型,如
类(class)、接口(interface)、数组(Array)
它们在声明的时候,JVM会首先在堆(Heap)中分配该类型大小的空间,用于存放成员变量,然后在栈中分配一小块内存,用于存放指向堆中那块内存的引用(Reference)
很多时候我们在传参数的时候需要一个Object类型的对象或其子类的对象,而基本数据类型并不是任何类的实例,因此Java引入了Boxing和Unboxing
Boxing:将基本数据类型封装成引用类型,首先在堆中分配一块内存,将基本数据对象的值拷贝进去,然后在栈中创建引用,Boxing之后的两个对象是不相干的
Integer类中有一个属性,用于存放封装的值
1Integer i =
new
Integer(
1
);
可见它封装的值是final(终态)的,也就是不可变的,对其赋新值其实是创建的一个新的对象
1private
final
int
value;
Unboxing:将包装类型转换成基本数据类型,Boxing的逆操作
1int
ii = i.intValue();
从Java5.0之后,JVM可以直接进行AutoBoxing和AutoUnboxing,下面的代码是合法的
1 2 | Integer i = 1 ; int ii = i; |
下面看个例子:
1 2 3 4 5 6 7 8 | Integer a = 100 ; Integer b = 100 ; Integer c = 1000 ; Integer d = 1000 ; System.out.println(a == b); System.out.println(a.equals(b)); System.out.println(c == d); System.out.println(c.equals(d)); |
既然是引用类型,我们期望得到false,true,false,true的结果,但是事实并非如此,运行结果如下
true
true
false
true
这是为什么呢?参考一下这里http://java.sun.com/docs/books/jls/third_edition/html/conversions.html
If the value p being boxed is
true
,false
, abyte
, achar
in the range \u0000 to \u007f, or anint
orshort
number between -128 and 127, then letr1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.
如果将要被封装的变量p是true,false,byte型,\u0000 - \u007f的char型,或者值在-128到127之间的int或short型,那么如果r1和r2是两个p的封装实例,r1 == r2总是成立
也就是说 如果数值在-128 ~ 127之间,同一个值的所有封装共用同一个对象,这发生在AutoBoxing过程中
如果要避免这种情况,请使用这种方法:
1 2 3 | Integer a = new Integer( 100 ); Integer b = new Integer( 100 ); System.out.println(a == b); //false |
最后我们总结下"=="
对于值相等的两个“对象”,如果有一个是基本数据类型,则"=="总恒为true(这里其实是将包装类型UnBoxing)
如果两个都是包装类型,则
如果有一个是通过new创建出来的,"=="为false(分配了新的空间)
否则(即都不是通过new创建,AutoBoxing的结果)
如果该值是boolean/byte/float/double类型之一
或者char/short/int/long类型之一并且值范围在-127 ~ 128之间,==为true,否则==为false
(关于float、double、long型,上文并未提到,读者可自行验证,在此不作赘述)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述