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 写道这个用得着测试吗?
呵呵,我感觉看了源码确实很容易知道结论。