聊聊、Integer 封装特性

  前几天在公司内部群,有人分享出了一道题,问谁能口算出来,他就膜拜那个人。题目如下:

 
 
1 Class cache = Integer.class.getDeclaredClasses()[0];
2 Field mycache = cache.getDeclaredField("cache");
3 mycache.setAccessible(true);
4 Integer[] newcache = (Integer[]) mycache.get(cache);
5 newcache[132] = newcache[133];
6 int a = 2;
7 int b = a + a;
8 System.out.printf("%d", b);
 问最后打印出来是多少?

 一眼看去就知道 int b = 4,int 是基本类型,它的值是改变不了的。问题在于后面的打印语句,printf 方法。

 这个题目考了几个点,第一个是 Integer 封装,Integer 作为 int 的封装类,它里面有一个 cache 缓存,区间值 -128 到 127,为什么要有这个缓存呢?这个是为了提高 Integer 运算效率,如果满足区间条件,就直接获取缓存中的对象进行比较。例如:Integer i = 10;Integer m = 10;那么 System.out.println(i == m)输出什么呢?答案是:true。但是如果 Integer i = 128;Integer m = 128 呢?答案又是什么呢?答案是:false。第二个是 printf 方法,如果上面的例子是 System.out.println(b);那么答案又不一样了。因为 printf 需要将 int 自动封装成 Integer,然后输出,但是 Integer 通过反射机制将 132 和 133 位置进行了对换,所以答案也就不一样了。

 具体的答案大家可以去试试,谢谢大家观看,希望有所帮助!

 

转载于:https://www.cnblogs.com/xums/p/8504243.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值