java知识:int与Integer区别

第一阶段:

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了一个新的。
			
 
 

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值