首页 > 代码库 > java jdk缓存-128~127的Long与Integer
java jdk缓存-128~127的Long与Integer
先判断下下面代码的输出结果
Qa:----------------------------------------------
Long a = Long.valueOf(127);
Long b = Long.valueOf(127);
System.out.println(a == b);
Long b = Long.valueOf(127);
System.out.println(a == b);
Qb:---------------------------------------------------
Long a = Long.valueOf(128);
Long b = Long.valueOf(128);
System.out.println(a == b);
Long b = Long.valueOf(128);
System.out.println(a == b);
--------------------------------------------------------
Qa:true
Qb:false
当时发现这个的问题起因是有同事把一个id属性由long改为大Long,导致一些地方用=比较id值出现了不一致的情况,最终导致了使用我们产品的部分人反馈某些功能不可以使用了,我这里所说的部分人就是那些人持有的id属性值超过127的用户。
很明显,这些地方不可以用 == 去比较两个Long类型,这也反映一个程序员的细心程度,小心转换这种基本类型到自定义类型。我这里主要解释下为什么-128~127 用==返回true。
看jdk关于Long类型的源码:
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
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);
}
}
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);
}
}
可以看到-128到127间的值北放到了一个数组中,即代码中的LongCache.cache[],所以我们拿到的是同一个实例,同理其它大类型也是同样,可以在看下Integer验证下
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。