Java包装类的自动装箱和拆箱

在讨论区中看到这样一个问题:

public static void main(String[] args) {
		Integer i  = 200;
		Integer j = 200;
		System.out.println(i == j); //false
		System.out.println(200 == i); //true
	}

原问题链接:http://www.oschina.net/question/727875_148095

第一个输出的结果为false,而第二个输出的结果为true。

注意 i 和 j 都不是基本的数据类型,而是类Integer的对象,这其中便涉及到java的自动装箱和拆箱的机制。

JDK 5.0之前都是手动进行包装类的装箱和拆箱,如下:

int i = 1;//基本数据类型int
Integer j = new Integer(i);//手动装箱
int k = j.intValue();//手动拆箱

5.0之后可以自动进行装箱和拆箱的操作,如下:

Integer i = 1;//自动装箱
int j = i;//自动拆箱

Integer i = 10;
System.out.println(i--);//10,计算时的自动拆箱

Integer a = 95;
Integer b = 95;
System.out.println("a==b:" + (a==b));//a==b:true

但是,如下程序输出的结果并不是一样的:

Integer a = 295;
Integer b = 295;
System.out.println("a==b:" + (a==b));//a==b:false

这是因为在自动装箱的时候,-128到127的值被装箱成Integer对象存在内存中是可以被重用的,因此第一个比较结果会输出true,而超出以上范围的数值装箱后的对象并不会被重用,那么就相当于new两个Integer对象,比较的结果自然是false。

在java中,每种基本数据类型都有对应的包装类,如下:

INDEX 基本数据类型 包装类
1 int Integer
2 char Character
3 float Float
4 double Double
5 byte Byte
6 short Short
7 long Long
8 boolean Boolean

参考链接:http://jzinfo.iteye.com/blog/450590

                http://www.jb51.net/article/31934.htm

你可能感兴趣的:(java,拆箱,装箱,包装类)