jdk 5.0 装箱 拆箱
来源:互联网 发布:庄子 书 知乎 编辑:程序博客网 时间:2024/06/05 15:17
在Java中,有两种截然不同的数据类型:值类型和引用类型。
值类型的数据不是对象,因而所占的内存和资源都相对较少,但是不能作为对象调用其toString()、hashCode()、getClass()、equals
()等等方法,也不能被直接加入到集合中;引用类型的数据是一个一个的对象,占用内存和资源较多,但是提供丰富的访问方法,同时作为真正的对象,可以直接放入集合。
所谓装箱,就是把值类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类的对象,或者把double包装成Double,等等。
所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。
在J2SE 5.0发布之前,我们只能手工的处理装箱和拆箱,而现在,编译器可以帮我们自动地完成这些必要的步骤。下面的代码我提供两个版本的装箱和拆箱,一个版本使用手工的方式,另一个版本则把这些显而易见的代码交给编译器去完成:
public static void manualBoxingUnboxing(int i) ...{
ArrayList<Integer> aList = new ArrayList<Integer>();
aList.add(0, new Integer(i));
int a = aList.get(0).intValue();
System.out.println("The value of i is " + a);
}
public static void autoBoxingUnboxing(int i) ...{
ArrayList<Integer> aList = new ArrayList<Integer>();
aList.add(0, i);
int a = aList.get(0);
System.out.println("The value of i is " + a);
}
看到了吧,在J2SE 5.0中,我们不再需要显式的去将一个值类型的数据转换成相应的对象,从而把它作为对象传给其他方法,也不必手工的将那个代表一个数值的对象拆箱为相应的值类型数据。当然,这里有一个问题必须要做一些说明:对于值类型和引用类型,在资源占用上,还是有明显区别的,在使用这一方便特性的同时,不要简单的忘记了它们本质上的不同。
ps:
下面给个例子让大家
public class Test {
public static void main(String args[]){
Integer m = new Integer(5);
Integer n = new Integer(5);
System.out.println(m==n);
m = m-1;
n = n-1;
System.out.println(m==n);
}
}
输出结果false true
先 false,后 true。
第一次比较:
比较两个不同对象地址,显然是 false。
第二次比较:
JDK 5 有自动拆箱和装箱的功能。
当进行 -1 运算后,m,n 将自动拆箱为原始类型,==为内容比较,而不是地址比较。
内容上,4 == 4,所以 true。
提醒:
这种操作只对 -128-127 值有效。
如果把 m,n 初始值换为 500,运行结果就两个都是 false 了。
另外一个例子
public class Test2 {
public static void main(String[] args) {
Integer i1 = 256;
Integer i2 = 256;
if (i1 = = i2)
System.out.println("相等!");
else
System.out.println("不相等!");
}
}
结果输出的是“不相等!”,两个对象比较,它们在内存中开辟的是两个地址怎么能相等呢?
警告:你可千万不能依赖这个结果,请把i1和i2的值,改成100.(请看Test3.java)看看什么结果,令人惊讶的是改了个数,居然输出了“相等!”。
这是因为JVM可以选择要尝试这段代码的最佳优化,并对两个Integer对象使用一个实例,这样的话“= =”就会返回true了。在自动装箱时对于值从–128到127之间的值,使用一个实例。
转载地址:
1 http://blog.csdn.net/jessieca/archive/2007/10/02/1809944.aspx
2 http://hi.baidu.com/%C0%E4%B0%C1%B5%C4%BB%EA%BB%EA/blog/item/86cdcf0291a580703912bbeb.html
- jdk 5.0 装箱 拆箱
- JDK 5.0新特性之自动装箱自动拆箱
- 装箱,拆箱
- 装箱-拆箱
- 装箱 拆箱
- 装箱 拆箱
- 装箱、拆箱
- JDK向下兼容之自动拆箱装箱
- 20、java jdk 5.0新特性(静态导入&自动装箱和拆箱&增强for循环 &可变参数)
- 装箱AND拆箱
- “装箱”与“拆箱”问题
- 装箱OR拆箱
- c#装箱,拆箱
- java 装箱/拆箱
- C# 装箱 拆箱
- java拆箱 装箱
- 装箱、拆箱、泛型
- C# 装箱 拆箱 泛型
- 黑马 JavaMail加深总结pop3协议收邮件
- Android GPS数据上报线程的开启流程
- 如何生成.jar可执行文件
- 基于微软Dryad分布式并行计算平台云技术的研究
- 期权是小公司吸引人才并留住人才的最大法宝
- jdk 5.0 装箱 拆箱
- 《 VB6.0中通过MSChart控件调用数据库 》
- Android 客户端与服务器交互方式
- 多种分割WebServer日志的方法
- android中Animation的使用!
- 多线程开发学习笔记(1)
- Ubuntu小技巧全面搜集
- 从 VC7 的 CHtmlView 不能正常退出谈 CComPtr 使用中的一个误区
- jad:反编译工具