很久很久以前
刚从业时,是做Java后端的
我们知道Integer是int的包装类,2个int类型的值是可以通过a == b
来进行比较的
于是想当然以为Integer也是可以这么比较
一次事故就要开始
一个简单的充值验证,需要比较充值数额是否相等,用的Integer类
我们测试的时候用的是1块钱(10金币),比较金币拿了2个Integer来做==
判断
10金币顺利通过测试,100金币也是,随之上线
事故的爆发
产品上线后,从后台查询发现,只有10金币和100金币的充值记录(但按经验看来是不合理的)
也有玩家陆续反应100块(1000金币)充值失败
原因
Java中<128
的Integer取的是常量,内存地址是一样的,>=128
时,则是重新开辟了一块内存
又因为==
是比较内存地址用的,比较值相等应该用a.equals(b)
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 |
package test; public class Test { public static void main(String[] args) { Integer goldA = 100; Integer goldB = 100; System.out.println(goldA == goldB); goldA = 1000; goldB = 1000; System.out.println(goldA == goldB); } } |
输出
1 2 |
true false |