Java的数值比较遇到的坑(==和equals的正确使用)
2019-03-12 本文已影响0人
henry技术探索记录员
我们公司的产品涉及到微信支付,在测试时我用100元微信支付购买我们的产品成功,10000块微信支付成功但购买产品失败。
另外,微信支付成功后的回调执行成功,所以可以排除是微信支付接口的调用问题,进一步将问题锁定在购买产品环节。
在真正购买产品之前,后端的逻辑会先查询微信支付的记录和我们后台购买的记录,如果微信支付订单存在,并且微信支付订单的金额<total_fee>10000</total_fee>
和我们后台购买记录的购买金额一致,则进行下一步购买操作。
这时我发现后端的判断逻辑中,判断微信支付订单的金额<total_fee>10000</total_fee>
和我们后台购买记录的购买金额是否一致用的是==,由于本人写多了js,切换到后端时可能思维没及时切换到java上,所以比较两个Long型数据用了==。在java中,==是判断两个对象是否是内存中的同一个对象,而equals方法才是判断内容是否相等。
查看java的Long.java类的源码,你会发现有一个内部私有类,LongCache.java,它缓存了从-128到127之间的所有的Long对象。
private static class LongCache {
private LongCache(){}
static final Long cache[] = new Long[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}
所以如果比较100==100因为比较的是同一个对象,所以返回true;如果比较10000==10000,因为比较的是不同对象,所以返回false。这就是为什么我测试时用100块和10000块微信支付都成功,但将微信支付记录和后天数据记录比较失败导致购买产品失败的原因。
我立即将==改成equals,问题解决了。