Java进阶-自动装箱、自动拆箱

JDK 5.0 新特性【以下的特性适合 JDK1.5 版本之后,包括1.5】
自动装箱(auto_boxing)和自动拆箱(auto_unboxing)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class IntegerTest05 {
public static void main(String[] args) {
// JDK 5.0 之前
// int --> Integer(装箱)
Integer i1 = new Integer(10);

// Integer --> int(拆箱)
int i2 = i1.intValue();

m1(321); // 自动装箱 321
System.out.println(m2(10, 5)); // 自动拆箱 5

// JDK 5.0 之后,包括 5.0
Integer i3 = 10; // 自动装箱
int i4 = i3; // 自动拆箱

System.out.println(i3); // "10"
System.out.println(i4 + 1); // 11
}

private static void m1(Object o) {
System.out.println(o);
}

private static int m2(Integer i, Integer j) {
return i - j;
}
}

深入

  1. 自动装箱和自动拆箱是程序编译阶段的一个概念,和程序运行无关
  2. 主要目的:方便程序员编码
  3. 比较两个 Integer 类型的数据是否相等,不能用“=”,Integer 已经重写了 Object 中的 equals 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class IntegerTest06 {
public static void main(String[] args) {
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);

// 这里不会有自动拆箱
System.out.println(i1 == i2); // false

// 应该使用 equals 方法比较
System.out.println(i1.equals(i2)); // true

// 重点:
Integer i3 = 128;
Integer i4 = 128;

// 上面等同于
// Integer i3 = new Integer(128);
// Integer i4 = new Integer(128);

System.out.println(i3 == i4); // false
}
}
  1. 如果数据是在(-128127)之间,java 中引入了一个“整型常量池”,在方法区中。**该整型常量池只存储-128127之间的数据**
1
2
3
4
5
6
7
Integer i5 = 127; // 这个程序不会在堆中创建对象,会直接从整型常量池中拿
Integer i6 = 127;
System.out.println(i5 == i6); // true

Integer i7 = -129; // 会在堆中创建对象
Integer i8 = -129;
System.out.println(i7 == i8); // false