Integer.valueOf()和new Integer()

1、new Integer():方法会在内存中新开辟一个内存空间;

2、valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象。

程序表象:

如果我们要调用50万次的new Integer(4),在不去设置jvm内存参数的情况下会outOfMemery,而Integer.valueOf(4)则不会。

我们可以分别用new Integer(4)和valueOf(4)构件5万个对象,用jmap -histo:live查看一下内存中Integer对象实例的个数:

new Integer(4)情况下:

 

 num     #instances         #bytes  class name

----------------------------------------------

   1:        500259        8004144  java.lang.Integer

valueOf(4)情况下:

 

26:           259           4144  java.lang.Integer

 

对于,第二点:“valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象。”

这里只是jdk的默认值,其实可以通过启动参数-XX:AutoBoxCacheMax修改掉最大范围,但最大值也不会超过:Integer.MAX_VALUE +128(这个源码可以看到),至于有人问为什么默认设计成(-128,127)这个还真不清楚

对于,是否需要测试的回复,呵呵个人感觉能看代码理解最好,看代码理解不了,测测也无妨

 

这是我在面试时问的一道题目,很多声称对java“精通”的人都回答不出来,我看我们对精通这个词需要好好斟酌一下了。

你可能感兴趣的:(JAVA基础)