文章目录
- 前言
- 一、Integer.valueOf源码
- 二、IntegerCache是什么?看看源码
- 三、代码举例
- 总结
前言
Integer和Interger.valueOf()有什么区别,JDK1.5源码之后引入了Interger.valueOf(int),具体是什么用处。
从源代码可以知道,valueOf对-128~ 127这256个值做了缓存(IntegerCache),如果int的取值范围是:-128~127在vlaueOf(int)时,他会直接返回IntegerCache的缓存给你。
一、Integer.valueOf源码
Integer a = new Integer(1);
Integer b = Integer.valueOf(1);
两个都是得到一个Integer对象,但是Integer.valueOf的效率高。为什么呢?因为Integer.valueOf用到了缓存。看看Integer.valueOf的代码:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
1、new Integer():方法会在内存中新开辟一个内存空间;
2、valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象。
二、IntegerCache是什么?看看源码
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache = new Integer(i - 128);
}
}
三、代码举例
Integer a=new Integer(1);
Integer b=new Integer(1);
//整数范围在-128到127之间,返回的是同一个对象
Integer c=Integer.valueOf(1);
Integer d=Integer.valueOf(1);
//返回的不是同一个对象
Integer e=Integer.valueOf(200);
Integer f=Integer.valueOf(200);
System.out.println(a==b);
System.out.println(c==d);
System.out.println(e==f);
输出为
false
true
false
所以,new Integer返回的永远是不同的对象,但是当整数范围在-128<i<=127时,Integer.valueOf返回的是同一个对象。
总结
在没有对Integer创建有特殊要求时,比如纯数字计算或比较,最好用Integer.valueOf。
Integer.valueOf(int):当这个值在-128和127之间时,会用缓存保存起来,供多次使用,以节约内存。
如果不在这个范围内,则创建一个新的Integer对象。
这个问题的本质是Integer的valueOf()方法。