当前位置: 首页 > news >正文

自动装箱和自动拆箱

http://www.cnblogs.com/xrq730/p/4869065.html

自动拆箱和自动装箱

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;
    }
}
复制代码

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

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

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

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

看到在自动装箱的时候,也就是第6行,Java虚拟机会自动调用Integer的valueOf方法;在自动拆箱的时候,也就是第10行,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;
}
复制代码

如果运行的话:

Exception in thread "main" java.lang.NullPointerException
    at main.Test7.main(Test7.java:8)

这种使用场景很常见,我们把一个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这两个浮点数却不是。关于这个小知识点,个人提出两点意见:

1、不重要,除了面试考察求职者对于知识的掌握程度,没多大用

2、要有缓存这个概念,缓存对于提高程序运行效率、节省内存空间是有很大帮助的

 

转载于:https://www.cnblogs.com/IvySue/p/7491561.html

相关文章:

  • 从Hadoop框架与MapReduce模式中谈海量数据处理(淘宝技术架构)
  • jQuery获取Select选择的Text和Value:
  • unity-------------UI的界面调节
  • SQL : 根据列名求表名等小技巧
  • F5-WAF-12.0
  • 程序员编程艺术第十二~十五章:IP访问次数,回文等问题(初稿)
  • 读取Execl表数据 导入数据库
  • jQuery插件ReverseOrder实现Javascript倒序及了解prependTo函数
  • 洛谷—— P1041 传染病控制
  • Python学习系列-----第二章 操作符与表达式
  • BZOJ 1617 Usaco River Crossing
  • SQL Server 2005数据库中,获取某个表的创建时间
  • 【bzoj2694】Lcm 莫比乌斯反演+线性筛
  • Eclipse中安装Java反编译插件JD-Eclipse
  • STM32单片机是如何启动的?
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Date型的使用
  • ES6语法详解(一)
  • flask接收请求并推入栈
  • gops —— Go 程序诊断分析工具
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java-详解HashMap
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Js基础知识(一) - 变量
  • Sass 快速入门教程
  • vue自定义指令实现v-tap插件
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端_面试
  • 入手阿里云新服务器的部署NODE
  • ​卜东波研究员:高观点下的少儿计算思维
  • # Maven错误Error executing Maven
  • (1)bark-ml
  • (2)nginx 安装、启停
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (多级缓存)缓存同步
  • (翻译)terry crowley: 写给程序员
  • (分类)KNN算法- 参数调优
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)jQuery 基础
  • (转)ObjectiveC 深浅拷贝学习
  • (转)德国人的记事本
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .md即markdown文件的基本常用编写语法
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈