深入理解java中的自动装箱与拆箱[通俗易懂]

本文由java语言入门栏目为大家推荐,文中通过详细实例为大家深入讲解了java中的自动装箱与拆箱的相关知识,希望可以帮助到大家。装箱是把基本数据类型转换为包装类,拆箱是把包装类转换为基本数据类型。

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

深入理解java中的自动装箱与拆箱[通俗易懂]

一、什么是装箱,什么是拆箱

装箱:把基本数据类型转换为包装类。

拆箱:把包装类转换为基本数据类型。

基本数据类型所对应的包装类:

int(几个字节4)- Integer

byte(1)- Byte

short(2)- Short

long(8)- Long

float(4)- Float

double(8)- Double

char(2)- Character

boolean(未定义)- Boolean

免费在线视频学习教程推荐:java视频教程

二、先来看看手动装箱和手动拆箱

例子:拿int和Integer举例

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();

手动装箱是通过valueOf完成的,大家都知道 = 右边值赋给左边,3是一个int类型的,赋给左边就变成了Integer包装类。

手动拆箱是通过intValue()完成的,通过代码可以看到 i1 从Integer变成了int

三、手动看完了,来看自动的

为了减轻技术人员的工作,java从jdk1.5之后变为了自动装箱与拆箱,还拿上面那个举例:

手动:

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();

自动

Integer i1=3;
int i2=i1;

这是已经默认自动装好和拆好了。

四、从几道题目中加深对自动装箱和拆箱的理解

(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语言入门

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120810.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 中石化项目都是些什么工程_中海油石化工程待遇

    中石化项目都是些什么工程_中海油石化工程待遇石化项目是什么?石化项目是什么工程?下面就让中策大数据为你解答。石油化工工程就是涵盖整个石油化工系统的工程。石化项目工程内容可以划分为以下几种:1、石油化工总的区分包括化工工程、石油工程、油气工程、储运工程等;2、按照行业划分包括石油开采工程、石油加工工程、化工化纤工程、石油化工后加工工程等;3、按照建设装置的工程区分,包括常减压装置工程、催化裂化装置工程、气体分馏装置工程、加氢裂化装置工程、加氢精制装置工程、脱硫制硫装置工程、重整装置工程、芳烃装置工程、乙烯工程、等等。4、按照

    2022年10月16日
  • navicat激活码最新(破解版激活)[通俗易懂]

    navicat激活码最新(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
  • springboot启动原理 通俗面试_spring高级面试题

    springboot启动原理 通俗面试_spring高级面试题importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;/***Helloworld!**/@SpringBootApplicationpublicclassApp{publicstaticvoidmain(String[]args){Syst.

    2022年8月20日
  • 十款很不错的磁盘碎片整理工具「建议收藏」

    十款很不错的磁盘碎片整理工具「建议收藏」
    说到磁盘整理工具,应该说说磁盘碎片的定义,为什么磁盘碎片会对系统性能造成影响。首先我不是专业的电脑人员,对很专业的理论知识不懂,在这里只可以用很通俗很日常的语言来表达。其实磁盘碎片应该称为文件碎片,是因为文件被分散保存到整个磁盘的不同地方,而不是连续地保存在磁盘连续的簇中形成的。为什么这些碎片多了,会对系统性能造成影响呢?打个比方,你的房间你很久没有整理和清洁了,原本有条不紊的东西变得乱七八糟,你找起东西来自然不方便,耗时间。系统读取硬盘数据也一样,硬盘数据琐碎散落,系统读取起来就

    2022年6月25日
  • angular7 父组件向子组件传值

    angular7 父组件向子组件传值1.新建子组件app-child2.在父组件中引用子组件<app-child[value1]=”fatherValue”></app-child>2.在子组件中使用@Input接受父组件传的值@Input()value1:string;value1就是父组件传到子组件的值了,可以在子组件中去使用…

    2022年6月5日
  • linux netlink套接字学习资料

    linux netlink套接字学习资料

    2022年2月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号