第一阶段:
int是基本数据类型,初始值是0Integer是引用数据类型,初始值是null
第二阶段:
相等问题,比如:public class Test {
public static void main(String[] args) {
Integer i1 = 2;
int i2 = 2;
System.out.println(i1 == i2);
}
}
之类的问题,那么就需要深入的学习一下了。
先说一下自动装箱与自动拆箱吧
自动装箱:
Integer i1 = 2左边是引用,右边是基本数据类型,JDK1.5之前应该报错,但是由于JDK1.5引入了自动装箱,所有没有问题。
但是自动装箱又做了什么呢?
Integer i1 = 2编译后就等同于Integer i1 = Integer.valueOf(2);原来自动装箱就是把2变成 Integer.valueOf(2)-----把int变成Integer。
自动拆箱:
System.out.println(i1 == i2)其中的i1==i2左边是引用,右边是基本数据类型,JDK1.5之前应该报错,但是JDK1.5引入了自动拆箱,所以没有问题。
但是自动拆箱又做了什么呢?
System.out.println(i1 == i2)编译后就等同于System.out.println(i1.intValue() == i2),自动拆箱就是把i1变成i1.intValue()----把Integer变成int。
现在自动装箱和拆箱已经说完了,那么答案呢?是true!
也许你有疑问,==不是比较的地址吗?i1和i2应该俩地址吧,应该是false啊!
其实==作用于引用的时候是比较的地址,作用于基本类型的时候比较的是数据。现在i1由于自动拆箱变成int,i2也是int。
那么==比较的就是值而不是地址。所以是true!
第三阶段:
代码考验与分析:(别人的例子)
1 package com.test; 2 /** 3 * 4 * @author 刘玲 5 * 6 */ 7 public class TestInteger { 8 9 /** 10 * @param args 11 */ 12 public static void main(String[] args) { 13 int i = 128; 14 Integer i2 = 128; 15 Integer i3 = new Integer(128); 16 //Integer会自动拆箱为int,所以为true 17 System.out.println(i == i2); 18 System.out.println(i == i3); 19 System.out.println("**************"); 20 Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127); 21 Integer i6 = 127; 22 System.out.println(i5 == i6);//true 23 /*Integer i5 = 128; 24 Integer i6 = 128; 25 System.out.println(i5 == i6);//false 26 */ Integer ii5 = new Integer(127); 27 System.out.println(i5 == ii5); //false 28 Integer i7 = new Integer(128); 29 Integer i8 = new Integer(128); 30 System.out.println(i7 == i8); //false 31 } 32 33 }
System.out.println(i == i2);//==左边是int右边是引用,此时i2会自动拆箱变成int型数据,==两边比较的是数值,所以是true。
System.out.println(i == i3);//分析同上。
System.out.println(i5 == i6);//第22行是true,第25行是false这是为什么呢?
==两边是引用,这下比较的是地址了!那么i5和i6是一个地址吗?
这里牵扯出另一个知识:Integer i5 = 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127);JDK源码的valueOf函数式这样的:
1 public static Integer valueOf(int i) { 2 assert IntegerCache.high >= 127; 3 if (i >= IntegerCache.low && i <= IntegerCache.high) 4 return IntegerCache.cache[i + (-IntegerCache.low)]; 5 return new Integer(i); 6 }
看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。所以22行的结果为true,而25行为false。
System.out.println(i5 == ii5);//i5相当于new了一个Integer(127),ii5又new了一个Integer(127),所以是false;
System.out.println(i7 == i8);//同上
第四阶段:总结
==做比较的时候,先看两边的数据类型:1、一个引用一个基本数据:那么是相等的,因为它会先拆箱,然后单纯比较数值。2、两个引用:a、Integer与new Integer比较是falseb、new Integer与new Integer比较是false
c、Integer与Integer:
i:Integer在-128到127之间是true;
ii:Integer在其余区间是false它相当于New了一个新的。