Java中Long类型比较出现异常结果的原因是什么?
Long类型用==比较出现不同结果的原因
这是Java中Long自动装箱的缓存机制导致的,具体拆解如下:
Long是引用类型,
==比较的是对象的内存地址,而非实际数值。你代码里用Long a = 100L这种写法时,Java会自动调用Long.valueOf(long)方法完成装箱操作。Long.valueOf()方法内部维护了一个缓存池,默认缓存范围是**-128到127**之间的Long对象。当传入的long值在这个范围内时,方法会直接返回缓存里的对象;超出范围时,会创建新的Long对象。对应你的代码:
Long a = 100L和Long b = 100L:100在-128~127范围内,所以a和b指向同一个缓存对象,==比较地址返回true。Long c = 150L和Long d = 150L:150超出缓存范围,每次装箱都会新建独立的Long对象,c和d指向不同的内存地址,==比较返回false。
正确的数值比较方式:
- 使用
equals()方法:c.equals(d),这个方法会比较Long对象的实际数值。 - 拆箱为基本类型long后用
==:(long)c == (long)d,或者直接声明为long类型而非Long。
- 使用
内容的提问来源于stack exchange,提问作者Ivn Alxv
相关产品推荐
相关产品推荐

