自动装箱和拆箱

1. 装箱

  • 装箱:基本类型-->引用数据类型
int num = 20;
Integer number = num;  // 自动装箱

上面最后一条语句相当于:Integer number = new Integer(num);

  • 但是问题来了。
  • Double d1=1.0;
    Double d2=new Double(1.0);

    Double d2 = new Double(d1)  和  Integer number = new Integer(num);是一个概念吗?

  • Integer包装类实现了常量池技术,因此num的20是从常量池中获取的
  • Double没有实现常量池技术,不再从常量池寻找数据,而是从堆中各自new一个对象。也就是说1.0在堆中,没有在常量池中。

2. 拆箱

  • 拆箱:引用数据类型-->基本类型
Integer number = new Integer(18);
int num = number;  // 自动拆箱

上面最后一条语句相当于:int num = number.intValue();

3. 例1

3.1 代码

package com.ilaoda.day0905;

/**
 * 自动装箱  拆箱
 * @author Administrator
 *
 */
public class Test3 {
	public static void main(String[] args) {
		Integer in1 = new Integer(100);
		Integer in2 = new Integer(100);

		Integer in3 = 100;
		Integer in4 = 100;

		System.out.println("in1 == in2:" + (in1 == in2));  //false
		System.out.println("in1 == in3:" + (in1 == in3));  //false
		System.out.println("in3 == in4:" + (in3 == in4));  //true  自动装箱,取值在byte范围内,所以指向同一块区域

		/**
		 * 为何和上面的in3、int4的比较一样为true。可是in5 == in6会出现false呢?
		 */
		Integer in5 = 128;
		Integer in6 = 128;

		System.out.println("in5 == in6:" + (in5 == in6));  //false
	}
}

3.2 答案

in1 == in2: false
in1 == in3: false
in3 == in4: true
in5 == in6: false

3.3 解释

这里有个小细节必须注意:
    对于自动装箱的操作,如果在赋值时,取值在byte范围内,也就是-128~127,他们指向同一块堆空间区域。如果超出byte的范围,那么就各自创建自己的对象,即重新new出来的一块空间。

4. 例2

4.1 代码

package com.ilaoda.day0905;

public class Test4 {
    public static void main(String[] args) {
        objPoolTest();
    }  

    public static void objPoolTest() {
        int i = 40;
        int i0 = 40;
        Integer i1 = 40;
        Integer i2 = 40;
        Integer i3 = 0;
        Integer i4 = new Integer(40);
        Integer i5 = new Integer(40);
        Integer i6 = new Integer(0);
        Double d1=1.0;
        Double d2=1.0;  

        System.out.println("i=i0: " + (i == i0));
        System.out.println("i1=i2: " + (i1 == i2));
        System.out.println("i1=i2+i3: " + (i1 == i2 + i3));
        System.out.println("i4=i5: " + (i4 == i5));
        System.out.println("i4=i5+i6: " + (i4 == i5 + i6));
        System.out.println("d1=d2: " + (d1==d2));

        System.out.println();
    }
}  

4.2 答案

i=i0: true
i1=i2: true
i1=i2+i3: true
i4=i5: false
i4=i5+i6: true
d1=d2: false

4.3 解释

时间: 2024-12-21 20:17:48

自动装箱和拆箱的相关文章

《Java中的自动装箱和拆箱功能.》

1 //Java中的自动装箱和拆箱功能. 2 class AutoboxingUnboxing 3 { 4 public static void main(String[] args) 5 { 6 //直接把一个基本类型变量赋给Interger对象. 7 Integer inObj = 5; 8 Object inObj1 = 6; 9 //直接把一个boolean类型的变量赋给一个Object类型的变量. 10 Object boolObj = true; 11 //直接把Integer对象赋

java自动装箱与拆箱

基本数据(Primitive)类型的自动装箱(autoboxing).拆箱(unboxing)是J2SE 5.0提供的新功能,跟泛型.变长参数等一样,这也是一颗"语法糖",之前介绍jvm早期优化的时候说过,语法糖对运行期的代码没有任何影响,其目的仅仅是方便程序员使用,所有语法糖编译后都将会还原成基础语法.这次介绍的自动装箱和拆箱也不例外.看下头的例子: public class Demo { public static void main(String[] args) { Intege

Java 自动装箱和拆箱

JDK1.5之后的功能 自动装箱:指的是开发人员可以把一个基本数据类型直接赋给对应的包装类 自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型 public static void main(String[] args) { Integer i = 1; //装箱 int j = i ; //拆箱 } public static void main(String[] args) { List list = new ArrayList(); list.add(1); int j=

深入剖析Java中的自动装箱和拆箱过程

深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 若有不正之处,请谅解和批评指正,不胜感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3780005.

自动装箱与拆箱引发的享元设计模式

[java] view plain copy /** * 自动装箱与拆箱 */ public class Autoboxing { public static void main(String[] args) { Integer num1 = 20;          //自动装箱 int num2 = new Integer(20);     //自动拆箱 System.out.println(num2 == num1);   //true //-128~127之间的同一个Intege对象相比

[转]java 自动装箱与拆箱

转自:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451996.html 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱): 其实按照我自己的理解自动装箱就可以简单的理解为将基本数据类型封装为对象类型,来符合java的面向对象:例如用int来举例: //声明一个

由自动装箱和拆箱引发我看Integer源码

背景和问题 在看别人整理的资料时,看到如下一段代码: package com.sitech.test; /** * 自动装箱和拆箱 jdk1.6 * @author liaowp * */ public class TestInteger { public static void main(String[] args) { Integer i1 = 80, i2 = 80, i3 = 999, i4 = 999; System.out.println(i1 == i2);//true Syste

Java 自动装箱与拆箱

Java为每种基本数据类型都提供了对应的对象类型.在Java SE5之前,如果要生成一个数值为7的Integer对象,代码示例:Integer i = new Integer(7);:Java SE5之后,Java提供了新的语法,简化了基本数据类型对象的使用,我们称之为自动装箱(autoboxing)与拆箱(unboxing).之前的代码可以简化为Integer i = 7;. Java提供的自动装箱盒拆箱,是在编译器层实现的.编译之后的字节码仍然是如Java SE5之前的形态.如自动装箱使用对

Java的自动装箱和拆箱

1 public class BoxingDemo { 2 3 public static void main(String[] args) { 4 5 /** 6 * 自动装箱示例: 7 * 基本类型int是不能直接赋值给其包装类对象Integer的,但是这里这条语句可以编译通过 8 * 因为自动装箱原理隐式包含了下面2条语句: 9 * Integer temp = new Integer(1); 10 * int1 = temp; 11 * */ 12 Integer int1 = 1; 1

Java 自动装箱和拆箱那些事

1.JAVA的基本数据类型 在Java中,数据类型可以分为两大种,Primitive Type(基本类型)和Reference Type(引用类型).基本类型的数值不是对象,不能调用对象的toString().hashCode().getClass().equals()等方法.所以Java提供了针对每种基本类型的包装类型.如下: Java基本数据类型 INDEX 基本类型  大小 数值范围 默认值 包装类型 1 boolean    --- true,false false Boolean 2