在讨论区中看到这样一个问题:
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.net
第一个输出的结果为false,而第二个输出的结果为true。code
注意 i 和 j 都不是基本的数据类型,而是类Integer的对象,这其中便涉及到java的自动装箱和拆箱的机制。htm
JDK 5.0以前都是手动进行包装类的装箱和拆箱,以下:对象
int i = 1;//基本数据类型int Integer j = new Integer(i);//手动装箱 int k = j.intValue();//手动拆箱
5.0以后能够自动进行装箱和拆箱的操做,以下:blog
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。get
在java中,每种基本数据类型都有对应的包装类,以下:it
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 |