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

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8207 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 178 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 393 关注
  • Gitea

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

    4 引用 • 16 回帖 • 2 关注
  • CodeMirror
    1 引用 • 2 回帖 • 123 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    370 引用 • 1215 回帖 • 582 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 693 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖 • 1 关注
  • 自由行
    2 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 293 关注
  • 导航

    各种网址链接、内容导航。

    37 引用 • 168 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 525 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    478 引用 • 902 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 547 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    1 引用 • 11 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 425 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 238 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 3 关注
  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 694 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 8 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖