Java 中的自动装箱与自动拆箱

本贴最后更新于 3084 天前,其中的信息可能已经时异事殊

Java有八种基本类型,分别是 int  short  long  byte  float  double  boolean  char。由于基本类型非面向对象,所以在有些时候,比如想使用.toString()就无法使用。因此。就产生了包装类,他们与基本类型相互对应。 

   int     Integer
   short    Short 
   long    Long 
   byte    Byte 
   float     Float
   double   double
   boolean    Boolean 
   char   Character



现在已经知道了,这些包装类的好处是可以使用一系列的好用的方法。得到了好处,必然也有一些让人苦恼的难以理解的部分。比如自动装箱与自动拆箱。 

首先,从简单的代码理解这两个过程 

Java代码  
  1. Integer i = 100;//自动装箱  
  2. int j = i;//自动拆箱  



然后再仔细理解一下。Integer名为包装类,自动将基本的“货物100”放入“包装箱Integer”内,就是自动装箱。相反就是自动拆箱。 

对于过程理解了,还有个陷阱需要记忆。但是这里,我觉得不要看其他人的理解,因为这是设计的特点,我们就要从源代码理解,这里如果从中间人的语言去思考的话,很可能进入误区了。 

Java代码  
  1. /** 
  2.     * Cache to support the object identity semantics of autoboxing for values between 
  3.     * -128 and 127 (inclusive) as required by JLS. 
  4.     * 
  5.     * The cache is initialized on first usage.  The size of the cache 
  6.     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option. 
  7.     * During VM initialization, java.lang.Integer.IntegerCache.high property 
  8.     * may be set and saved in the private system properties in the 
  9.     * sun.misc.VM class. 
  10.     */  
  11.   
  12.    private static class IntegerCache {  
  13.        static final int low = -128;  
  14.        static final int high;  
  15.        static final Integer cache[];  
  16.   
  17.        static {  
  18.            // high value may be configured by property  
  19.            int h = 127;  
  20.            String integerCacheHighPropValue =  
  21.                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");  
  22.            if (integerCacheHighPropValue != null) {  
  23.                try {  
  24.                    int i = parseInt(integerCacheHighPropValue);  
  25.                    i = Math.max(i, 127);  
  26.                    // Maximum array size is Integer.MAX_VALUE  
  27.                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);  
  28.                } catch( NumberFormatException nfe) {  
  29.                    // If the property cannot be parsed into an int, ignore it.  
  30.                }  
  31.            }  
  32.            high = h;  
  33.   
  34.            cache = new Integer[(high - low) + 1];  
  35.            int j = low;  
  36.            for(int k = 0; k < cache.length; k++)  
  37.                cache[k] = new Integer(j++);  
  38.   
  39.            // range [-128, 127] must be interned (JLS7 5.1.7)  
  40.            assert IntegerCache.high >= 127;  
  41.        }  
  42.   
  43.        private IntegerCache() {}  
  44.    }  
  45. **  
  46.     * Returns an {@code Integer} instance representing the specified  
  47.     * {@code int} value.  If a new {@code Integer} instance is not  
  48.     * required, this method should generally be used in preference to  
  49.     * the constructor {@link #Integer(int)}, as this method is likely  
  50.     * to yield significantly better space and time performance by  
  51.     * caching frequently requested values.  
  52.     *  
  53.     * This method will always cache values in the range -128 to 127,  
  54.     * inclusive, and may cache other values outside of this range.  
  55.     *  
  56.     * @param  i an {@code int} value.  
  57.     * @return an {@code Integer} instance representing {@code i}.  
  58.     * @since  1.5  
  59.     */  
  60.    public static Integer valueOf(int i) {  
  61. /如果输入的数值大于-128-127,则使用缓存的数组,否则创建新的对象,这对判断两个数值==很有用  
  62.        if (i >= IntegerCache.low && i <= IntegerCache.high)  
  63.            return IntegerCache.cache[i + (-IntegerCache.low)];  
  64.        return new Integer(i);  
  65.    }  
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 545 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1114 回帖 • 124 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 228 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 43 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 660 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 6 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 733 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 155 关注
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖 • 2 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 614 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 374 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 911 回帖 • 245 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 710 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22352 引用 • 89437 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 212 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 30 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 4 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    153 引用 • 3783 回帖 • 1 关注