java jdk5 中的装箱与拆箱

原创 2007年10月02日 21:35:00

看过.NET基础的朋友可能对这个装箱和拆箱的概念并不陌生。首先,我们必须明确一点,在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(
0new 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中,我们不再需要显式的去将一个值类型的数据转换成相应的对象,从而把它作为对象传给其他方法,也不必手工的将那个代表一个数值的对象拆箱为相应的值类型数据。当然,这里有一个问题必须要做一些说明:对于值类型和引用类型,在资源占用上,还是有明显区别的,在使用这一方便特性的同时,不要简单的忘记了它们本质上的不同。

关于Integer补充一个例子:

public class wrapper {
    
public static void main(String[] args) {

    Integer i1 
= 129;
    Integer i2 
= 129;
    Integer i3 
= -128;
    Integer i4 
= -128;
    
/*two equal integers(between-128~127),the result is "equal!"
     else ,it 's "not equal!". why? Because the JVM try to optimize
     the code ,so between -128~127 ,it use the same object 
*/


    
if (i1 == i2) 
        System.out.println(
"equal!");
    
else 
        System.out.println(
"not equal!");
    
if (i3==i4)
        System.out.print(
"equal!");
    
else 
        System.out.println(
"not equal!");

    }

 
 

 

Java学习笔记之自动装箱与拆箱

更多博文可参考我的个人独立博客:贱贱的梦想 什么是自动装箱与拆箱自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Intege...
  • GongchuangSu
  • GongchuangSu
  • 2016年05月28日 22:28
  • 1191

详解Java的自动装箱与拆箱(Autoboxing and unboxing)

一、什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程//自动装箱 Integer total = 99;//自定拆箱 int totalprim = total;简单一点说,装箱就是...
  • hp910315
  • hp910315
  • 2015年09月22日 15:27
  • 5103

装箱和拆箱的区别与详解

深入剖析Java中的装箱和拆箱   自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇...
  • LiMing_0820
  • LiMing_0820
  • 2016年10月17日 15:45
  • 1390

简述:C# 装箱和拆箱

一、概念简述: 在装箱拆箱之前简单说一下值类型、引用类型: 值类型:原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Doub...
  • u014076894
  • u014076894
  • 2015年04月16日 13:35
  • 1078

Java包装类、自动装箱与拆箱知识总结

因为在学习集合时知道集合里存放的对象都是Object类型,取出的时候需要强制类型转换为目标类型(使用泛型集合不需要),如int a = (Integer)arrayList.get(0);然后我们就会...
  • zhangliangzi
  • zhangliangzi
  • 2016年01月21日 08:36
  • 3404

C# - 再谈C#的装箱和拆箱

上一篇写了一下装箱拆箱的定义和IL分析,这一篇我们看下使用泛型和不使用泛型引发装箱拆箱的情况 1. 使用非泛型集合时引发的装箱和拆箱操作  看下面的一段代码: 1 2 3 ...
  • honey199396
  • honey199396
  • 2016年08月31日 11:35
  • 536

Java中的基本类型与封装类型以及自动装箱、拆箱

Java中的类型分为原始类型和对应的封装类型(装箱类型),基本类型包括byte字节型(一个字节)、char字符型(两个字节)、short短整型(两个字节)、int整型(四个字节)、long长整型(八个...
  • yunzhongfeiniao
  • yunzhongfeiniao
  • 2013年12月21日 16:10
  • 1950

值类型和引用类型间的转换-装箱和拆箱

装箱(Boxing)和拆箱(Unboxing)是C#类型系统中重要的概念。它允许将任何类型的数据转换为对象,同时也允许任何类型的对象转换到与之兼容的数据类型。 1.装箱 装箱转换是指将一个值类型的数据...
  • Gary_888
  • Gary_888
  • 2016年05月16日 13:45
  • 989

C#--三行代码带你理解神秘的拆箱和装箱

一、在说拆箱和装箱之前的准备知识首先,我们需要知道c#中有两种类型:值类型和引用类型 名称 值类型 引用类型 表示类型 基本类型 类,数组,接口 ,C#特有的委托. 存储内容...
  • qq_32452623
  • qq_32452623
  • 2016年12月29日 17:22
  • 3052

【Java】Java的==和equals()以及自动装箱拆箱

Java的==和equals()以及自动装箱拆箱Java的和equals以及自动装箱拆箱 抛一个问题 先说一说 和 equals方法equals方法 再说一下Integer的缓存机制 自动装箱和自动...
  • cflys
  • cflys
  • 2017年07月22日 11:02
  • 374
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java jdk5 中的装箱与拆箱
举报原因:
原因补充:

(最多只允许输入30个字)