您当前的位置: 首页 >  Java

慕晨sekurlsa

暂无认证

  • 3浏览

    0关注

    82博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JAVA面试题——关于ValueOf的取值问题

慕晨sekurlsa 发布时间:2022-09-10 21:19:00 ,浏览量:3

先来看三个判断:

package com.javaexe;

public class AboutValueOf {
    public static void main(String[] args) {
        Integer n = new Integer(1);
        Integer m = new Integer(1);
        System.out.println(n == m);

        Integer n1 = Integer.valueOf(1);
        Integer m1 = Integer.valueOf(1);
        System.out.println(n1 == m1);

        Integer n2 = 128;
        Integer m2 = 128;
        System.out.println(n2 == m2);

    }
}

问:这三个判断分别会输出什么? 答案是false、true、false。

第一个很好理解,new Integer()返回的直接是一个Integer的对象实例。 用==来比较两个对象时,比较的是地址,n和m两个对象的地址是不同的,所以返回false。

重点是第二个和第三个为什么一个返回true,一个返回false?

首先第三个是自动装箱,它的本质其实就是Integer.valueOf(),所以本质和第二个是一样的。

这时候就需要看到Integer包装类的valueOf()方法了。

在这里插入图片描述

从上面valueOf()方法的源码中,我们可以看出,其实它返回的不一定是对象。 如果满足if条件,也就是大于等于IntegerCache.low并且小于等于IntegerCache.high,那么返回的就是IntegerCache数组中的数值i,否则才会去new一个Integer的对象来返回。

同样从源码中看到IntegerCache.low和IntegerCache.high的值分为是-128和127。

在这里插入图片描述

到这就明白了为什么第二个是true,而第三个返回的是false了。原因就是第二个的值为1,符合if的条件,返回的是IntegerCache数组中的值,并不是对象,这时候==判断的是值,值相等,返回true。而第三个128,不符合if的条件,返回的是new出来的Integer对象,所以==依旧判断的是地址,返回false。

关注
打赏
1663680270
查看更多评论
立即登录/注册

微信扫码登录

0.0570s