封装类与自动装箱,拆箱

什么是装箱和拆箱

装箱:将基本数据类型自动转化为对应的封装类 

拆箱:将封装类自动转为对应的基本数据类型

Integer x=4;
x=x+5;

在上面的代码中,4首先自动装箱为Integer类对象赋值给x;然后,x与5运算的时候又自动拆箱为基本数据类型。

实际上,Integer在装箱过程中调用了Integer中的valueOf()方法,拆箱为int时调用了Integer中的intValue()方法。这两个方法的源码如下:

public static Integer valueOf(int i){
   assert IntergerCache.high>=127;
   if(i>=IntergerCache.low&&i<=IntergerCache.high)
       return IntergerCache.cache[i+(-IntergerCache.low)];
       return new Integer(i); 
   }
public int intValue(){
    return value;
}

这便是自动装箱与拆箱的底层执行过程,其他封装类类似。 

自动装箱和拆箱中的一些问题

问题1:

public class Main {
    public static void main(String[] args){
        Integer i1=100;
        Integer i2=100;
        Integer i3=200;
        Integer i4=200;
        System.out.println(i1 == i2);//true
        System.out.println(i3 == i4);//false
    }
}

上面代码中“i1==i2”返回true,而“i3==i4”返回false。这是因为在源码中“i1==i2”返回true是因为100属于-128到127范围内,给i1和i2赋值的时候,直接返回cache[]数组中的对象,属于同一个对象,从而返回true;而200超过了这个范围,给i3和i4赋值的时候直接返回new Integer(),因此属于两个不同的对象,结果为false。

问题2:

public class Main {
    public static void main(String[] args){
        Double i1=100;
        Double i2=100;
        Double i3=200;
        Double i4=200;
        System.out.println(i1 == i2);//false
        System.out.println(i3 == i4);//false
    }
}
public static Double valueOf(double d){
    return new Double(d);
}

 

从源码中可以得出Double封装类的valueOf()是返回一个新的封装类对象,因此“i1==i2”和“i3==i4”都返回false。

总结:

1.Integer派别:Integer,Short,Byte,Character,Long这几个类的valueOf()方法的实现是类似的,每次根据数据大小返回对象,有可能两次返回同一个对象,也可能是不同对象。

2.Double派别:Double,Float的valueOf()方法的实现是类似的,每次都返回不同的对象。 

                                                      Integer派类

类型

相同对象范围

不同对象范围

Integer

(-128,128)

i>=128||i<-128

Short

(-128,128)

s>=128||i<-128

Character

c<128

c>=128

Long

(-128,128)

v>=128||v<-128 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值