第一阶段:
int是基本数据类型,初始值是0
Integer是引用数据类型,初始值是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比较是false
b、new Integer与new Integer比较是false
c、Integer与Integer:i:Integer在-128到127之间是true;ii:Integer在其余区间是false它相当于New了一个新的。
都是根据别人总结的,不对的地方请指正。
















