首页 > Java > java教程 > 正文

浅谈什么是java的自动装箱和自动拆箱?

青灯夜游
发布: 2018-10-19 17:43:02
转载
2865人浏览过

本篇文章给大家带来的内容是浅谈什么是java的自动装箱和自动拆箱?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。

自动拆箱和自动装箱

Java为每种基本数据类型都提供了对应的包装器类型。举个例子:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i = 10;
    }
}
登录后复制

这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱。再看另外一段代码:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer integer = 10;
        int i = integer;
    }
}
登录后复制

这个过程中会根据包装器类型自动将数据转换为基本类型,这就是自动拆箱。

立即学习Java免费学习笔记(深入)”;

至于自动装箱和自动拆箱的原理也很简单。通过命令行程序,进入CLASSPATH(也就是bin目录下.class文件所在的路径),javap反编译查看一下生成的字节码:

反编译出来的内容有很多,我们只关注重点部分:

public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_1
         1: invokestatic  #16                 // Method java/lang/Integer.valueO
f:(I)Ljava/lang/Integer;
         4: astore_1
         5: aload_1
         6: invokevirtual #22                 // Method java/lang/Integer.intVal
ue:()I
         9: istore_2
        10: return
登录后复制

看到在自动装箱的时候Java虚拟机会自动调用Integer的valueOf方法;在自动拆箱的时候Java虚拟机会自动调用Integer的intValue方法这就是自动拆箱和自动装箱的原理

小心空指针异常

有这么一段代码:

public static void main(String[] args) throws Exception
{
    Object obj = getObj(null);
    int i = (Integer)obj;
}
    
public static Object getObj(Object obj)
{
    return obj;
}
登录后复制

这种使用场景很常见,我们把一个int数值放在session或者request中,取出来的时候就是一个类似上面的场景了。所以,小心自动拆箱时候的空指针异常。

小陷阱

看两段代码,第一段代码为:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }
}
登录后复制

运行结果为:

true
false
登录后复制

第二段代码为:

public class TestMain
{
    public static void main(String[] args)
    {
        Double d1 = 100.0;
        Double d2 = 100.0;
        Double d3 = 200.0;
        Double d4 = 200.0;
        
        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
    }
}
登录后复制

运行结果为:

false
false
登录后复制

产生这样的结果的原因是:Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法是以128位分界线做了缓存的,假如是128以下且-128以上的值是会取缓存里面的引用的,以Integer为例,其valueOf(int i)的源代码为:

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }
登录后复制

而Float、Double则不会,原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,但是float、double这两个浮点数却不是。

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问Java视频教程java开发图文教程bootstrap视频教程

以上就是浅谈什么是java的自动装箱和自动拆箱?的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号