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

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

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

    3201 引用 • 8216 回帖 • 2 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Java

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

    3201 引用 • 8216 回帖 • 2 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • Word
    13 引用 • 41 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • Bootstrap

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

    18 引用 • 33 回帖 • 647 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 444 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 406 关注
  • Follow
    4 引用 • 12 回帖 • 2 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 441 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖
  • WordPress

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

    46 引用 • 114 回帖 • 168 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 61 关注
  • API

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

    79 引用 • 431 回帖 • 1 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 635 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 1 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 7 关注
  • Git

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

    211 引用 • 358 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    10019 引用 • 45549 回帖 • 71 关注
  • OpenStack

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

    10 引用 • 1 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 652 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    300 引用 • 768 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 52 关注
  • 叶归
    12 引用 • 56 回帖 • 20 关注
  • Access
    1 引用 • 3 回帖 • 1 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 8 关注