首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Integer.valueOf()跟new Integer()

2012-10-18 
Integer.valueOf()和new Integer()1、new Integer():方法会在内存中新开辟一个内存空间;2、valueOf():方法只

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“精通”的人都回答不出来,我看我们对精通这个词需要好好斟酌一下了。
1 楼 zhufeng1981 2011-10-30   研究的很深入,支持一下。不过我很想知道Java对

“2、valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象”处理的原因。 2 楼 yunhun5114 2011-10-31   zhufeng1981 写道研究的很深入,支持一下。不过我很想知道Java对

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

去看源代码就知道了 valueOf() 的     3 楼 Technoboy 2011-10-31   这个用得着测试吗? 4 楼 zhufeng1981 2011-10-31   yunhun5114 写道zhufeng1981 写道研究的很深入,支持一下。不过我很想知道Java对

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

去看源代码就知道了 valueOf() 的    
源代码我到是看了,没理解他的原因啊,为啥就是-128~127的时候缓存,所以才有一问,呵呵 5 楼 zhufeng1981 2011-10-31   Technoboy 写道这个用得着测试吗?
呵呵,我感觉看了源码确实很容易知道结论。

热点排行