Java 自动装箱 和 自动拆箱
您目前处于:技术核心竞争力  2013-11-24

自动装箱:

/**
 * 实际上,程序运行时,系统为我们执行了下面一条语句:
 * Integer number = new Integer(290);
 */
Integer number = 290;
System.out.println(number);

自动拆箱:

Integer number = 290;
// Other code
/**
 * 实际上,程序运行时,系统为我们执行了下面一条语句:
 * int number2 = number.intValue();
 */
int number2 = number;
System.out.println(number2);

就上面示例代码块而言,实际上自动装箱就是系统自动帮我们去 new 了 Integer 对象,大家都知道,每个对象都会有一个 hashCode() 方法,这个方法是继承 Object 而来,Object 类是所有类的超类。当需要比较两个对象是否相等时,可以用 "==" 和 equals 来做比较。

于对象而言, "==" 比较的是哈希码的值,也就是比较 hashCode() 方法的返回值,这个值是唯一的,在底层它是用来确定对象在堆内存上的存储位置。"==" 也可以用来做基本数据类型的比较。equals 方法大家都知道,它是用来比较两个对象的内容是否一样。

上面说到自动装箱其实就是系统自动帮我们去 new 了 Integer 对象,但是神奇的事情发生了:

当 int 的取值在 -128 ~ 127 之间的时候,这时候系统并不会每次都帮我们去 new 一个 Integer 对象,而是取值相同的对象只会被 new 一次,取值相同的 Integer 对象系统不会再去 new 一次,而是共享了已有的这个 Integer 对象。

而当 int 的取值在 -128 ~ 127 之外的时候,这时候不管 Integer 对象的取值是否一样,系统都会去 new 一个。

// -128~127 之内的数
Integer number1 = 40;
Integer number2 = 40;
System.out.println("number1 == number2 : " + (number1 == number2));
       
// -128~127 之外的数
Integer number3 = 128;
Integer number4 = 128;
System.out.println("number3 == number4 : " + (number3 == number4));
System.out.println("number3 equals number4 : " + (number3.equals(number4)));

示例代码输出结果:

number1 == number2 : true
number3 == number4 : false
number3 equals number4 : true

short 与 int 的装箱规则是一样,就不多说了,但不要认为所有的基本数据类型都有这样一个规则,比如 float 和 double 都没有这样的规则,float 和 double 每次装箱的时候都是会包装成一个对象的。


转载请并标注: “本文转载自 linkedkeeper.com ”  ©著作权归作者所有