`

Jdk5 中的装箱与拆箱

    博客分类:
  • Java
阅读更多

在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之间的值,使用一个实例。

转载地址:
分享到:
评论

相关推荐

    jdk5.zip

    JDK 5引入了自动装箱与拆箱机制,简化了这一步骤,使得基本类型和包装类之间的转换更加流畅。 此外,枚举(Enums)的引入是JDK 5中的一个重要改变。枚举类型允许创建一组相关的常量,提高了代码的可读性和安全性。...

    jdk5_64.zip

    在JDK5之前,Java中基本类型与对应的包装类之间无法直接转换,需要手动装箱和拆箱。JDK5引入了自动装箱和拆箱机制,使得基本类型与包装类之间的转换变得无缝且高效,提升了编程的便利性。 四、变长参数(Varargs) ...

    浅谈Java自动装箱与拆箱及其陷阱

    Java中的自动装箱和拆箱是自JDK 1.5版本引入的一种语言特性,它极大地简化了基础数据类型(如int)与它们对应的包装类(如Integer)之间的转换过程。这一特性使得开发者无需手动创建包装类实例或使用显式类型转换,...

    java jdk 5学习笔记

    JDK 5引入了自动装箱和拆箱的概念,使得基础类型与对应的包装类之间可以无缝转换。例如,int与Integer,无需手动调用`Integer.valueOf()`或`.intValue()`。 2. **枚举类型(Enum)**: 在JDK 5之前,Java没有内置的...

    JDK5免安装解压包

    在JDK5中,对多线程编程进行了大量改进,包括引入了`java.util.concurrent`包,其中包含了许多高效的并发工具类,如Executor框架、Future接口、Semaphore信号量等。 10. **NIO(New Input/Output)** NIO提供了非...

    JDK 5中文文档PDF文档JDK 5中文文档PDF文档

    3. **自动装箱/拆箱(Autoboxing and Unboxing)**:自动装箱允许在原始类型与对应的包装类之间无缝转换,简化了代码。例如,`Integer i = 5;` 会自动将int转换为Integer对象,而 `int j = i;` 又会自动将Integer...

    JDK5up22 Windows64位绿色版

    1. **自动装箱与拆箱**:JDK5引入了自动装箱和拆箱的概念,使得基本类型和其对应的包装类之间可以无缝转换,提高了代码的可读性。 2. **枚举类型(Enum)**:JDK5引入了枚举,这是一种新的数据类型,用于表示有限...

    JDK 5.0.zip

    3. **自动装箱与拆箱**:JDK 5.0中,原始类型(如int)与对应的包装类(如Integer)之间可以自动进行装箱(将原始类型转换为对象)和拆箱(将对象转换为原始类型)操作,简化了代码编写。 4. **可变参数(Varargs)...

    Javajdk5学习笔记

    1. **自动装箱与拆箱**:JDK 5引入了自动装箱和拆箱功能,使得基本类型和它们对应的包装类之间可以无缝转换,提高了代码的简洁性。例如,`Integer i = 10;` 和 `int j = i;` 这样的操作在JDK 5后变得非常自然。 2. ...

    jdk5 64位exe文件.zip

    虽然JDK5本身并未引入NIO.2,但这个特性在后续的JDK7中出现,是对JDK5中NIO(非阻塞I/O)的扩展,提供了更高级别的文件系统操作和异步I/O。 **64位版本的优势:** 64位版本的JDK5能够利用64位操作系统提供的更大...

    jdk6中文api.rar

    3. **自动装箱与拆箱**:从JDK 6开始,基本数据类型与其对应的包装类之间可以自动进行装箱和拆箱操作,简化了编程。 4. **动态代理**:Java 6通过`java.lang.reflect.Proxy`类和`java.lang.reflect....

    jdk5 win7 64位

    - **自动装箱/拆箱(Autoboxing and Unboxing)**:自动装箱将基本类型与对应的包装类之间进行转换,简化了代码。 - **可变参数(Varargs)**:允许在方法声明中使用可变长度的参数列表,方便调用。 - **增强的...

    JDK1.5、JDK5下载

    2. **自动装箱与拆箱(Autoboxing/Unboxing)**:自动装箱允许在基本类型和对应的包装类之间进行无缝转换,简化了代码编写。 3. **枚举类型(Enums)**:枚举是一种新的数据类型,用于定义有限集合的常量,提高了...

    JDK1.5中文帮助文档

    2. **自动装箱与拆箱(Autoboxing and Unboxing)** 自动装箱允许在基本类型和对应的包装类之间进行无缝转换,简化了代码,例如int和Integer之间的操作。 3. **枚举类型(Enums)** JDK 1.5引入了枚举类型,为...

    jdk5 windows 32位.rar

    2. **Autoboxing/Unboxing**:自动装箱和拆箱功能,使得基本类型与对应的包装类之间可以无缝转换。 3. **枚举类型(enum)**:增强了枚举的使用,使其成为一种强大的数据类型,支持比较、遍历等操作。 4. **变量作用...

    jdk1.5(jdk-1_5_0_08-windows-i586-p.exe)

    自动装箱和拆箱简化了基本类型与对应的包装类之间的转换,使得代码更加简洁。 4. **变量注解(Varargs)** 通过使用`...`操作符,可以定义接受任意数量参数的方法,提高了代码的灵活性。 5. **增强的for循环...

    jdk5.0 资源下载

    2. 自动装箱/拆箱(Autoboxing and Unboxing):自动装箱允许基本数据类型与对应的包装类之间进行无缝转换,简化了代码,提高了编写效率。 3. 枚举类型(Enums):JDK5.0引入了枚举类型,使得常量的定义更加规范,...

    jdk1.5.0_12源代码

    在JDK1.5.0_12的源代码中,可以看到编译器如何处理这种转换,例如,当基本类型与包装类进行操作时,编译器会自动添加装箱和拆箱的操作。 4. **变长参数(Varargs)**: 变长参数允许一个方法接受不定数量的参数。...

    tomcat5 兼容jdk1.4插件

    JDK 5在2004年发布,引入了许多重要的新特性和改进,包括泛型、枚举、自动装箱/拆箱、可变参数等。因此,如果用户仍然使用JDK 1.4,那么他们将无法直接运行Tomcat 5.x。而通过提供这个“兼容jdk1.4插件”,开发者...

    JDK5_新特性

    7. **类型安全的自动装箱/拆箱**: 自动封箱和解封在JDK5.0中进行了优化,确保类型安全,避免了因隐式类型转换可能导致的错误。 8. **注解(Annotations)**: 注解提供了一种元数据机制,允许在代码中添加信息,...

Global site tag (gtag.js) - Google Analytics