Java中 Integer、Integer.valueOf、new Integer区别

博主在前段时间的一次面试中,偶尔发现一道这样的面试题,后来发现挺有意思,而且我相信很多开发小伙伴在平时的开发中也不会太在意,所以突然出现这样一道题,会有点懵~

面试题是这样的:

第一题:

        Integer a1 = 25;

        Integer a2 = Integer.valueOf(25);

        Integer a3 = new Integer(25);

        System.out.println(a1 = a2);

        System.out.println(a1 = a3);

        System.out.println(a2 = a3);

        请写出最终运行结果。并解释一下结果的原因。

第二题:

        Integer a1 = 128;

        Integer a2 = Integer.valueOf(128);

        Integer a3 = new Integer(128);

        System.out.println(a1 = a2);

        System.out.println(a1 = a3);

        System.out.println(a2 = a3);

        请写出最终运行结果。并解释一下结果的原因。

正确结果:

第一题:

 

第二题:

 

结果分析:

1、第一题第一个结果是true,是因为直接声明Integer和Integer.valueOf方法会使用常量缓存池中的对象,无论调用多少次,都只会取同一个对象的引用;

2、第一题第二个结果是false,是因为使用 new 时,创建的是新的对象,也就意味着地址不同,所以结果是 false;

3、第一题第三个结果是false,是因为和第二题同理,使用new时,创建的是新的对象,所以地址不同,结果是false。

4、第二题结果都是false,是因为 Integer 内置的 256 个缓存数据是在 -128~127 之间,超过这个范围时会创建新的对象。而 128>127 ,所以 a1 和 a2、a3 都会创建新的对象,地址也就不同了,所以结果都是一样的 false。

这就是Integer、Integer.valueOf、new Integer三者的区别,当然int也是同理。

然后我们来扒一下valueOf()方法的源码, 

我们可以看到,valueOf()方法内部主要使用了一个静态内部类 IntegerCache

我们都知道,用 static 关键字外加一个大括号括起来的代码被称为静态代码块,通常用来初始化一些静态变量,优先于 main() 方法执行。

在静态代码块中,low 为 -128,也就是缓存池的最小值;high 默认是 127,也就是缓存才能中的最大值,一共是 256 个。

如果此文章对你有帮助,请帮忙分享、收藏、点赞~😘😘😘

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值