来段java,教你埋坑,劝你善良

本文探讨了Java中Integer包装类的数字缓存机制,通过一个例子展示了如何利用反射改变缓存,导致运算结果异常。解释了Integer.valueOf方法的缓存优化,以及当反射修改`IntegerCache`时可能引发的问题。强调了对象比较时使用equals的必要性,并提醒开发者注意这类潜在的安全隐患。
摘要由CSDN通过智能技术生成

数字运算,是一门语言安身立命的根本。如果连1+1都变得不可信了,整个程序就会变得不可信。

考虑到这样一段代码:

Integer a = 1;
System.out.println(a);
Integer b = 2;
System.out.println( a.intValue() == b.intValue() );
System.out.println(a.equals(b)); 

执行的结果,竟然是:

-996
true
true 

这时候,你还敢继续把代码写下去么?

image-20210725153558913.png

为什么会这样?

很简单,我们使用反射改变了某些东西。

下面这段代码,将会改变一些基本运算的执行逻辑,理所当然属于埋坑的范畴之一。我们还是先看一下它的行为。

public class StaticBlock {
    static {
        try {
            Class<?> cls = Integer.class.getDeclaredClasses()[0];
            Field f = cls.getDeclaredField("cache");
            f.setAccessible(true);
            Integer[] cache = ((Integer[]) f.get(cls));
            for (int i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值