博主在前段时间的一次面试中,偶尔发现一道这样的面试题,后来发现挺有意思,而且我相信很多开发小伙伴在平时的开发中也不会太在意,所以突然出现这样一道题,会有点懵~
面试题是这样的:
第一题:
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 个。
如果此文章对你有帮助,请帮忙分享、收藏、点赞~😘😘😘