java 中的装箱和拆箱

基本概念

字节的单位: byte。位的单位: bit
1byte=8bit

8种基本数据类型

4种整型
2种浮点类型.
1种用于表示Unicode编码的字符单元的字符类型
1种用于表示真值的boolean类型。

数据类型浮点型大小(占字节数,2的几次方)范围默认值包装器类型
byte(字节)8-128 -1270Byte
shot(短整型)16-32768 - 327680Short
int(整型)32-2147483648-21474836480lnteger
long(长整型)64-9233372036854477808-92333720368544778080Long
float(浮点型)32-3.40292347E+38-3.40292347E+380.0fFloat
double(双精度)64-1.79769313486231570E+308-1.79769313486231570E+3080.0dDouble
char(字符型)16\u0000-\uffff\u0000Character
boolean(布尔型)1true/falsefalseBoolean

包装类

包装类即使把基本类型变成对象类型,包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

包装类转换关系

  • 基本类型 -> 包装器类
    lnteger obj=new lnteger(10);
  • 包装器类 -> 基本类型
    int num=obj.intValue();
  • 字符串 -> 包装器类
    lnteger obj=new lnteger(“100”);
  • 字符串 -> 基本类型
    int num=lnteger.parselnt(“-45.36”);

自动装包/拆包(Autoboxing/unboxing)

基本类与包装类的转换。则是装包与拆包
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.( Integer >> int)

int是基本类型,直接存储数值

lnteger是对象类, new一个对象时用一个引用指向这个对象Java把内存划分成两种:一种是栈内存、另一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而实际的对象是在存储堆内存中
比如:
int i= 10:直接在栈中分配空间
Integer j = new Integr(5):对象是在堆内存中,而j(引I用变量)是在栈内存中
在堆中分配的内存、由java虚拟机的白动垃圾回收器来管理。
因为在堆中分配空间所需的时间远大于从栈中分配存储空间。

什么是装箱?什么是拆箱?

在Java SE5之前,如果要生成一个数值为10的Integer对象.必须这样进行:
lnteger i = new Integer(10)
而在从Java SE5开始就提供了自动装箱的特性.如果要生成一个数值为10的Integer对象,只需要这样就可以了:
Integer i = 10
这个过程中会自动根据数值创建对应的Integer对象,这就是装箱。

那什么是拆箱呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基本数据类型;

Integer i = 10; //装箱
int n = i;//拆箱

简单一点说.装箱就是自动将基本数据类型转换为包装器类型:拆箱就是自动将包装器类型转换为基本数据类型。

相关面试题

1.下面这段代码的输出结果是什么?

    @Test
    public void test(){
        Integer i1=100;
        Integer i2=100;
        Integer i3=200;
        Integer i4=200;

        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }

答案

true
false

在通过valueOI方法创建lnteger对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的integer对象。
上面的代码中i1和2的数值为100,因此会直接从cache中取已经存在的对象,所以1和i2指向的是同一个对象,而i3和4则是分别指向不同的对象。

2.下面这段代码的输出结果是什么?

	@Test
    public void test2(){
        Double i1=100.0;
        Double i2=100.0;
        Double i3=200.0;
        Double i4=200.0;

        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }

答案

false
false

在这里只解释一下为什么Double类的valueO方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。

注意:Integer、Short、Byte、Character、Long这几个类的valueOt方法的实现是类似的。
Double、Float的valueOf方法的实现是类似的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值