[Java开发之路](19)Long缓存问题
来源:互联网 发布:剪切后数据恢复 编辑:程序博客网 时间:2024/04/29 23:09
Long中有个小小的陷阱,就是在-128至127范围内,Long.valueOf(long l)返回的Long的实例是相同的,而在此范围之外每次使用valueOf(long l)时,返回的实例都是不同的。
举例:
System.out.println(Long.valueOf(-129) == Long.valueOf(-129)); // false
System.out.println(Long.valueOf(-128) == Long.valueOf(-128)); // true
System.out.println(Long.valueOf(127) == Long.valueOf(127)); // true
System.out.println(Long.valueOf(128) == Long.valueOf(128)); // false
下面我们通过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);
}
从上面代码中我们可以看出先判断传递过来的数值是否在[-128,127]之间,如果是则直接从缓存中返回对应的引用,否则新创建一个Long的实例。所以说如果不在这个区间范围内,返回一个新创建的Long类型引用,用==判断就会理所当然的返回false,地址不一样。但是如果我们使用equals方法,则会返回true,数值是一样的。
Long.valueOf(128).equals(Long.valueOf(128)) // true
我们看看对于在区间范围之内,是如何返回对应的引用?最重要的是Long类中有一个静态的内部类LongCache,专门用于缓存-128至127之间的值。
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);
}
}
在LongCache类中定义了一个cache数组,来存储缓存数据。我们可以看到cache数组的长度:-(-128) + 127 + 1,很明了的知道缓存数据从-128到127,后面的1代表数字0,一共256个元素。
valueOf这个方法设计比较好的一点是offset,它的初始值设为128,目的就是为了数组下标128处存放0,这样就将正数和负数分隔开。
2 0
- [Java开发之路](19)Long缓存问题
- java java.lang.Long详解之二 缓存
- java java.lang.Long详解之二 缓存
- 关于蓝牙开发之数据缓存问题(脏数据)
- 【Java】基本类型之long(六)
- java Tips 之 long
- 微信网页开发之缓存问题
- 开发之缓存(一):内存缓存
- iOS开发之缓存(二):缓存
- java开发之缓存框架--ehcache
- java微信开发之----“缓存”坑
- Web开发_问题解决(1)之处理ajax页面缓存的问题
- iOS开发之缓存(一):内存缓存
- iOS开发之缓存(一):内存缓存
- iOS开发之缓存(一):内存缓存
- iOS开发之缓存(一):内存缓存
- iOS开发之缓存(一):内存缓存
- iOS开发之缓存(二):本地缓存机制
- 动漫迷看的一点动漫
- 利用Visual Studio 2013编译PCL 1.8.0 源码
- gdb调试工具的使用
- 计算机网络总结
- extern "C"
- [Java开发之路](19)Long缓存问题
- 文件上传下载的原理
- codeforces 651B B. Beautiful Paintings(贪心JAVA代码)
- WPF:如何在工作线程中更新窗体的UI元素(Dispatcher机制)
- cookies和session简单介绍
- JFinal对model及其子类进行单元测试以及快速写出多线程Junit单元测试用例
- 选择排序
- WebView与JS交互
- R-CNN论文笔记《Rich feature hierarchical for accurate object detection and semantic segmentation》