深入理解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语言入门

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • BetterIntelliJ-1.19 通用激活码【最新永久激活】[通俗易懂]

    (BetterIntelliJ-1.19 通用激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html1TCF2R91JZ-eyJsaWN…

  • Java 事务注解(注解式事务)

    spring中的@Transactional(rollbackFor=Exception.class)事务处理,当你的方法中抛出异常时,它会将事务回滚,数据库中的数据将不会改变,也就是回到进入此方法前的状态。1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)2 让uncheck

  • 直接sql 添加字段赋值

    直接sql 添加字段赋值SELECTuf.fans_idasfansId,u.`nickname`asnickname,u.`head`ashead,uf.`create_time`ascreateTime,1astypeFROM`user_fans`ufLEFTJOIN`user`uONuf.fans_id=u.idWHEREuf.`u…

    2022年10月25日
  • Negative Sampling 负采样详解[通俗易懂]

    Negative Sampling 负采样详解[通俗易懂]在word2vec中,为了简化训练的过程,经常会用到NegativeSampling负采样这个技巧,这个负采样到底是怎么样的呢?之前在我的博文word2vec算法理解和数学推导中对于word2vec有了很详细的数学推导,这里主要讲解一下负采样是如何降低word2vec的复杂度的。首先我们直接写出word2vec的目标函数,假设有一句话:query=w1,w2,w3,..,wnquery=…

  • MySQL数据库:存储引擎

    MySQL数据库:存储引擎

  • Android Intent.FLAG_ACTIVITY_NEW_TASK的个人理解「建议收藏」

    Android Intent.FLAG_ACTIVITY_NEW_TASK的个人理解「建议收藏」首先分四部曲简单做一下说明1.What(是什么):Intent类中的一个静态标志属性publicstaticfinalintFLAG_ACTIVITY_NEW_TASK=0x10000000;2.Why(为什么要使用):在特殊情况下,如果不加这个标志,会报错(下文详细说明)3.When(什么时候使用):当调用startActivity启动一个Activity时4.How(如何

发表回复

您的电子邮箱地址不会被公开。

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