您的位置:首页 > 编程语言 > Java开发

java知识:int与Integer区别

2017-07-05 14:42 441 查看

第一阶段:

int是基本数据类型,初始值是0Integer是引用数据类型,初始值是null

第二阶段:

相等问题,比如:publicclassTest {    publicstaticvoidmain(String[] args) {        Integer i1 =2;        inti2 =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了一个新的。

都是根据别人总结的,不对的地方请指正。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java