天天看点

Integer.valueOf(int)学习前言一、Integer.valueOf源码二、IntegerCache是什么?看看源码三、代码举例总结

文章目录

  • 前言
  • 一、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()方法。