在JDK1.5之后引入了自动装箱(autoboxing)与自动拆箱(unboxing),这让很多对java的初学者感到很疑惑,我刚才也是其中一员。
首先,有一些基本的概念需要了解:
1、Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。
2、Integer是一个类,用Integer声明一个变量是一个对象类型(或者说引用类型);int是基本类型,用int声明的变量是非对象类型,即不能在其上调用方法。
3、“==”作用于对象上的时候,其比较的是对象的引用本身的值(或者说对象的地址更容易理解),而作用于基本类型的时候比较的就是基本类型的值。
然后,我们需要明白两个基本概念:自动装箱与自动拆箱
Integer a=1;//这就是一个自动装箱,如果没有自动装箱的话,需要这样Integer a=new Integer(1)
int b=a;//这就是一个自动拆箱,如果没有自动拆箱的话,需要这样:int b=a.intValue()
这样就能看出自动装箱和自动拆箱是简化了基本数据类型和相对应对象的转化步骤
1.、Integer x = 10与Integer y = new Integer(10)不会相等。因为这两者在比较的时候不会经历拆箱过程,后者的引用指向堆,而前者指向专门存放他的内存(-128~127的常量池),他们的内存地址不一样,所以为false、
public static void main(String[] args) {
Integer i = 10;
Integer j = new Integer(10);
System.out.println(i == j); //false
}
2、两个都不是new出来的Integer,如果数在-128到127之间,则是true,否则为false
public static void main(String[] args) {
Integer i = 10;
Integer j = 10;
System.out.println(i == j); //true
}
public static void main(String[] args) {
Integer i = 128;
Integer j = 128;
System.out.println(i == j); //false
}
很多人在这里不懂为什么,这里就需要说下原因了:
java在编译Integer i = 10的时候,被翻译成Integer i = Integer.valueOf(10);
JDK源码的valueOf函数式这样的:
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
对于-128到127之间的数,会进行缓存,Integer i = 10时,会将10进行缓存,下次再写Integer j = 10时,就会直接从缓存中取,就不会new了。
所以第一段代码的结果是true.
反之,对于-128到127之外的数,参照valueOf函数的最后一行,会返回一个new(新的) Integer对象。
当Integer i =128的时候产生了第一个Integer对象,当Integer j = 128的时候产生了第二个Integer对象,两个对象的地址不同。
3、当两者都是new Integer()出来的时候,两者肯定不相同。
public static void main(String[] args) {
Integer i = new Integer(10);
Integer j = new Integer(10);
System.out.println(i == j); //false
}
这里有个比较,就是Integer i = 10;Integer j = 10是相同的,因为这时候i和j取得的都是缓存中值为10的地址(参照2)
4、如果Integer类型与int类型比较,只要两者的值相等,则Integer类型与int类型就相同。
public static void main(String[] args) {
Integer i = 128;
Integer j = new Integer(128);
int k =128;
System.out.println(i == j); //false
System.out.println(i == k); //true
System.out.println(j == k); //true
}
因为当Integer类型与int类型比较的时候,java是向下转型的,所以Integer类型会自动拆箱变成int类型,所以,两者在比较的时候会是比较数值。