自动装箱和自动拆箱:int与Integer(源码详解)

本文详细解析了Java中基本数据类型与对象的区别,包括自动装箱与拆箱的过程,以及Integer对象在不同数值范围内的缓存机制。强调了在-128到127之间的整数会复用对象,从而提高效率。

一、基本数据类型与对象的差别

基本数据类型不是对象,也就是使用int、double、boolean等定义的变量、常量。
基本数据类型没有可调用的方法

int i = 1; //后面没有可以被调用的方法
Integer i = 1;//后面有很多方法可以被调用

Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
Java 为每个原始类型提供了包装类型:

  • 原始类型: boolean,char,byte,short,int,long,float,double
  • 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

二、什么是自动装箱拆箱

基本数据类型的自动装箱、拆箱是从J2SE 5.0开始提供的功能。
如:

//① 创建一个类的对象实例时
Class a = new Class(paramenter);
//② 创建一个Integer对象时,却可以
Integer i =100;//自动装箱 Integer i = Integer.valueOf(100);
//③
int t = i;//自动拆箱  int t = i.intValue();
//④
System.out.println(i++);//运算时,自动拆箱
//⑤
Integer a =new Integer(3);
Integer b =3; //将3自动装箱成Integer类型
int c =3;
System.out.println(a==b);//false 两个引用没有引用同一对象
System.out.println(a==c);//true a自动拆箱成int类型,再和c比较

实际上,当执行语句②时,系统为我们执行了: Integer i = Integer.valueOf(100);此也就是基本数据类型的自动装箱功能
执行语句③时,实际执行了int t = i.intValue();自动拆箱功能
语句④,运算时,也可以进行拆箱。

三、Integer的自动装箱:Integer.valueOf(int i);

Integer.java源码

public static Integer valueOf(int i){ 
  if(i>=-128 && i<=IntegerCache.high)//-128~127 若没有设置,则IntegrCache.high默认为127
    return IntegerCache.cache[i+128];//(一)此时,Integer.valueOf(int i)返回的是缓存的Integer对象
  else
    return new Integer(i);//(二)返回一个新建的Integer对象
}

例如:自动装箱功能

//① 在-128~127之外的数
Integer i1 =200;
Integer i2 =200;
System.out.println("i1==i2:"+(i1==i2));
//② 在-128~127之内的数
Integer i3 =100;
Integer i4 =100;
System.out.println("i3==i4:"+(i3==i4));
//③ 不使用自动装箱功能时
Integer i5 = new Integer(100);
Integer i6 = new Integer(100);
System.out.println("i5==i6:"+(i5==i6));

以上,输出结果
i1==i2:false 源码中的情况(二),返回的是新建的Integer对象,所以i1与i2指向不同的对象
i3==i4:true 源码中的情况(一),返回的是缓存Integer对象,所以i3与i4指向的是同一个对象
i5==i6:false 当不使用自动装箱功能时,情况与普通类对象一样

总结:

  1. 装箱过程是通过调用包装器的valueOf方法实现的
  2. 拆箱过程是通过调用包装器的xxxValue方法实现的(xxx表示对应的基本数据类型)
  3. Byte、Short、Integer、Long这几个类的valueOf方法实现类似的。所以在[-128,127]区间内,==比较的时候,值总是相等的(指向的是同一对象),在这个区间外是不等的。
  4. 而Float和Double则不相等, Boolean的值总是相等的
  5. equals():比较两个对象的值(内容)是否相同
    ”==“:比较两个对象的引用(内存地址)是否相同,也用来比较两个基础数据类型的变量值是否相等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值