java自动装箱和拆箱
发布日期:2022-02-05 04:27:53 浏览次数:2 分类:技术文章

本文共 2224 字,大约阅读时间需要 7 分钟。

java自动装箱和拆箱

基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特征,不能调用方法。

装箱:将基本类型转换成包装类对象

int i=10;Integer x=new Integer(i);手动装箱Integer y=10;自动装箱

拆箱:将包装类对象转换成基本类型的值

Integer j=new Integer(8);int m=j.intValue();//手动拆箱int n=j;//自动拆箱

java基本类型介绍

基本数据类型一共有8种,详细信息如下表:

在这里插入图片描述
这八个和基本数据类型对应的类统称为包装类(Wrapper Class)。

各数据类型所占字节大小

byte:1字节

short:2字节

int:4字节

long:8字节

float:4字节

double:8字节

boolean:1字节

char:2字节

什么是自动拆箱与自动装箱

自动装箱:把基本类型用它们对应的包装类包装起来,使它们具有对象的特质,可以调用所对应的包装类所定义的方法,比如toString()等。

举个例子:

Integer i0 = new Integer(0);   Integer i1 = 2;   Integer i1_ = Integer.valueOf(2);

自动拆箱与自动装箱的jdk1.5才引入的新特性,所以如果你的jdk版本低于1.5的话,是不可以这样写的。

为什么会有自动拆箱与自动装箱

1.基础数据类型和包装类型相互转换便捷

没有自动拆箱与自动装箱:

Integer i = new Integer(2);//假如需要一个integer的对象i,值为2 int b=i.intValue();//需要一个int型的值,大小与i相等

有自动拆箱与装箱:

Integer i = 2;int b = i;

基础数据类型和包装类型相互转换非常便捷。

2.自动装箱的过程其实可以起到节约内存的作用。

Integer a = 1;Integer b = 1;Integer c = 144;Integer d = 144;Integer a1 = new Integer(1);Integer b1 = new Integer(1);System.out.println(a == b);         //trueSystem.out.println(a.equals(b));    //trueSystem.out.println(a1 == b1);       //falseSystem.out.println(a1.equals(b1));  //trueSystem.out.println(c == d);         //falseSystem.out.println(c.equals(d));    //true

第7行为true而第12行为false的原因是:

在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象 。而如果超过了从**–128127之间的值,被装箱后的Integer**对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。

怎么使用自动拆箱与自动装箱

自动拆箱与装箱实际上就是jvm帮我们去调用一些函数,这样可以使我们的代码更简洁一些。但是下面这段代码,编译也可以正常通过,运行的时候会抛出空指针异常。

注意:在使用自动拆箱时,一定要确保包装类的引用不为空。

Integer a = null;int b = a;

Integer源码解析

valueOf()方法:

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

在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用。现在明白是为什么了吧,在调用valueOf()方法的时候,会判断你所给的数是不是在IntegerCache.low 和 i <= IntegerCache.high之间,如果是,那么他就在内存中生成唯一的对象,当你第二次想要生成它的时候,他会把第一次所生成对象的地址给你,不会重新生成。而不在这个范围里的数,你每次所生成的对象都是不同的。

自动装箱池的大小定义

Integer自动装箱池的范围是-128~127
Byte,Short,Long范围是-128~127
Character范围是0~127
Float和Double没有自动装箱池

总结

Java通过自动装箱和拆箱的机制,节省了部分内存开销和创建对象的开销,提高了效率同时简化了代码。

在使用该机制的时候,需要注意以下几点:
1.在进行==比较的时候,在自动装箱池范围内的数据的引用是相同的,范围外的是不同的。
2。在自动拆箱时,要保证包装类的引用不为空。

转载地址:https://blog.csdn.net/weixin_43287508/article/details/86704036 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java 基础知识
下一篇:进程和线程的区别

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月25日 20时43分00秒