1.什么是装箱,什么是拆箱
装箱:把基本数据类型转换为包装类。
拆箱:把包装类转换为基本数据类型。
基本数据类型所对应的包装类:
int(几个字节4)- Integer
byte(1)- Byte
short(2)- Short
long(8)- Long
float(4)- Float
double(8)- Double
char(2)- Character
boolean(未定义)- Boolean

所谓装箱与拆箱都是指图中属于Number这个行列的,不针对上面那俩(Boolean,Character)

2.先来看看手动装箱和手动拆箱
例子:拿int和Integer举例
Integer i1=Integer.valueOf(3);
int i2=i1.intValue();
手动装箱是通过valueOf完成的,大家都知道 = 右边值赋给左边,3是一个int类型的,赋给左边就变成了Integer包装类。
手动拆箱是通过intValue()完成的,通过代码可以看到 i1 从Integer变成了int

3.手动看完了,来看自动的
为了减轻技术人员的工作,java从jdk1.5之后变为了自动装箱与拆箱
还拿上面那个举例:
手动:        
Integer i1=Integer.valueOf(3);
int i2=i1.intValue();
自动
Integer i1=3;
int i2=i1;
这是已经默认自动装好和拆好了

4.从几道题目中加深对自动装箱和拆箱的理解
(1.)
Integer a = 100;
int b = 100;
System.out.println(a==b);结果为 true
原因:a 会自动拆箱和 b 进行比较,所以为 true
(2.)
Integer a = 100;
Integer b = 100;
System.out.println(a==b);结果为true
Integer a = 200;
Integer b = 200;
System.out.println(a==b);结果为false
这就发生一个有意思的事了,为什么两个变量一样的,只有值不一样的一个是true,一个是false

原因:这种情况就要说一下 == 这个比较符号了,== 比较的内存地址,也就是new 出来的对象的内存地址,看到这你们可能会问这好像没有new啊,但其实Integer a=200; 200前面是默认有 new Integer的,所用内存地址不一样 == 比较的就是 false了,但100为什么是true呢?这是因为 java中的常量池 我们可以点开 Integer的源码看看

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }
在 对 -128到127 之间的进行比较时
不会new 对象,而是直接到常量池中获取,所以100是true,200超过了这个范围然后进行了 new 的操作,所以内存地址是不同的

(3.)
Integer a = new Integer(100);
Integer b = 100;
System.out.println(a==b);
结果为false
这跟上面那个100的差不多啊,从常量池中拿,为什么是false呢?

原因:new Integer(100)的原因,100虽然可以在常量池中拿,但架不住你直接给new 了一个对象啊,所用 这俩内存地址是不同的

(4.)
Integer a = 100;
Integer b= 100;
System.out.println(a == b);
结果true
a = 200;
b = 200;
System.out.println(c == d);
结果为false
原因:= 号 右边值赋给左边a,b已经是包装类了,200不在常量池中,把int 类型200 赋给包装类,自动装箱又因为不在常量池中所以默认 new了对象,所以结果为false

Java基础 带你深刻理解自动装箱,拆箱含义的更多相关文章

  1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?

    参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...

  2. java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add System.arrayCopy()用于集合等的扩容

    8种基本数据类型的8种包装类 byte Byte short Short int Integer long Long float Float double Double char Character ...

  3. java自动装箱拆箱总结

    对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a ...

  4. JAVA自动装箱拆箱与常量池

    java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...

  5. Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 // 自动装箱 2 Integer total = 90 ...

  6. Java 的自动装箱拆箱

    Java 是面向对象的语言,其基本数据类型也就有了相对应的类,称为包装类.以下是基本数据类型对应的包装类: 基本数据类型 包装类 byte(1字节) Byte short(2字节) Short int ...

  7. Java的自动装箱/拆箱

    概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...

  8. JAVA的自动装箱拆箱

    转自:http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html 蛋呢  的空间 ??什么是自动装箱拆箱 基本数据类型的自动装箱(a ...

  9. Java 自动装箱/拆箱

    自动装箱/拆箱大大方便了基本类型(8个基本类型)数据和它们包装类的使用 自动装箱 : 基本类型自动转为包装类(int >> Integer) 自动拆箱: 包装类自动转为基本类型(Integ ...

随机推荐

  1. 关于自动化打包部署Jenkins的使用和配置

    (未写完整,待续...) 名词解释: 1.Jenkins中对svn进行操作,可通过插件和脚本两种方式进行. 插件方式 在插件管理中安装"Subversion Plug-in",即可 ...

  2. 18 11 13 装了ssd 继续 网络通信 tcp 客户端的创建

    import socket def main(): # 1. 买个手机(创建套接字 socket) 联通公司建立了一个信号塔 tcp_server_socket = socket.socket(soc ...

  3. HTML 的 元素分析

    一一元素分类 常用的块状元素有: <div>.<p>.<h1>...<h6>.<ol>.<ul>.<dl>.< ...

  4. 细说opcache

    ; opcache的开关,关闭时代码不再优化. opcache.enable=1 ; Determines if Zend OPCache is enabled for the CLI version ...

  5. 01 语言基础+高级:1-10 JDK8新特性_day12【函数式接口】

    day12[函数式接口] 主要内容自定义函数式接口函数式编程常用函数式接口 教学目标能够使用@FunctionalInterface注解能够自定义无参无返回函数式接口能够自定义有参有返回函数式接口能够 ...

  6. 黑马IDEA版javaweb_2-2MySQL

    今日内容 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库? * 用于存储和管理数据的仓 ...

  7. java通过HSSFWorkbook导出xls文件

    使用swgger2.Restlet等接口工具有bug导致导出失败,测试直接使用浏览器 //导出列表-新 @UserRoleJudgment(authpos = SystemControllerLog. ...

  8. keras中保存自定义层和loss

    在keras中保存模型有几种方式: (1):使用callbacks,可以保存训练中任意的模型,或选择最好的模型 logdir = './callbacks' if not os.path.exists ...

  9. vim下看C++代码

    看C++代码, 缺少合适的编辑器,捣鼓vim. 安装Vundle, 用于插件管理 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vi ...

  10. beta函数分布图

    set.seed(1) x<-seq(-5,5,length.out=10000) a = c(.5,0.6, 0.7, 0.8, 0.9) b = c(.5, 1, 1, 2, 5) colo ...