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. OpenMP笔记(五)

    任务调度主要用于并行的for循环中,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代的话,会造成各个线程计算负载不均衡,这会使得有些线程先执行完,有些后执行完,造成某些CPU核 ...

  2. h5-背景样式

    <style> div{ width: 100%; height: 150px; border: 1px solid red; /*overflow: scroll;*/ /*1.添加背景 ...

  3. share团队冲刺6

    团队冲刺第六天 昨天:进行各种原件的自定义样式,进行界面布局 登陆界面: 今天:进行后台的代码编写,实现各种按钮的功能 问题:在不同的型号手机上,界面会发生不兼容的问题.

  4. 树状数组--模版1和2 P3368、P3374

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m,分别表示该数列数字的个数和操作的总个数. 第二行包含 n 个 ...

  5. dfs--迷宫

    题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次只能移 ...

  6. dotnet core 禁用https

    1,在  Properties\launchSettings.json 中的applicationUrl删除 https的选项  2,在Startup.cs中注释掉  app.UseHttpsRedi ...

  7. geodjango七日学习笔记 (7.30整理本地笔记上传到网络)

    第一天进行到现在,在开端的尾巴,想起来写一个学习笔记, 开发环境已搭好,用的是pycharm 环境是本机已有的interpreter python3.7   接下来要做的是新建一个geodjango项 ...

  8. vue执行期间的函数

    先放上vue官方给的函数图

  9. 第二季第十一天 html5语义化标签 css透明度

    span不能设置宽高背景 HTML5语义化标签 <section>标签所包裹的是有一组相似的主题的内容,可以用这个标签来实现文章的章节.标签式对话框中的各种标签页等类似的功能. <s ...

  10. java中常见的json解析方法、库以及性能对比

    常见的json解析有原生的JSONObject和JSONArray方法,谷歌的GSON库,阿里的fastjson,还有jackson,json-lib. Gson(项目地址:https://githu ...