`
victorzhzh
  • 浏览: 202175 次
  • 来自: ...
社区版块
存档分类
最新评论

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“精通”的人都回答不出来,我看我们对精通这个词需要好好斟酌一下了。

3
2
分享到:
评论
5 楼 zhufeng1981 2011-10-31  
Technoboy 写道
这个用得着测试吗?

呵呵,我感觉看了源码确实很容易知道结论。
4 楼 zhufeng1981 2011-10-31  
yunhun5114 写道
zhufeng1981 写道
研究的很深入,支持一下。不过我很想知道Java对

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


去看源代码就知道了 valueOf() 的    

源代码我到是看了,没理解他的原因啊,为啥就是-128~127的时候缓存,所以才有一问,呵呵
3 楼 Technoboy 2011-10-31  
这个用得着测试吗?
2 楼 yunhun5114 2011-10-31  
zhufeng1981 写道
研究的很深入,支持一下。不过我很想知道Java对

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


去看源代码就知道了 valueOf() 的    
1 楼 zhufeng1981 2011-10-30  
研究的很深入,支持一下。不过我很想知道Java对

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

相关推荐

    实验二 使用MIDP用户界面API编程.doc

    i = Integer.valueOf(s).intValue(); tf1.setString(i*0.45359 + ""); } else if(!s.equals("") && tf2.getString().equals("")) { i = Integer.valueOf(s).intValue(); tf2.setString(i*2....

    android 上传文件

    fileOutStream.seek(Integer.valueOf(position)); byte[] buffer = new byte[1024]; int len = -1; int length = Integer.valueOf(position); while( (len = fileOutStream.read(buffer)) ...

    可以滑动界面切换tab

    tabWidget.getChildAt(Integer.valueOf(i)).setBackgroundColor(R.color.white); } } } @Override public boolean dispatchTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event...

    java中long类型转换为int类型-java long转int.pdf

    long转int 由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出...int ii = Integer.parseInt(String.valueOf(ll)); 这三种方法都比较简单明了。

    Java实现Excel导入导出

    String.valueOf(item.getStockPrice().multiply(new BigDecimal(item.getStockAmount()))), "01".equals(item.getSalesSource()) ? "线上订单" : "线下订单", item.getGoodsNameAttrs(), String.valueOf(item....

    基于servlet的购物车

    int bookNum = Integer.parseInt(request.getParameter(String.valueOf(bookid))); System.out.println(bookNum); //封装成line对象 Line line = new Line(book, bookNum); System.out.println(line); ...

    java水仙花源代码

    n=Integer.valueOf(inputLine).intValue(); } catch (Exception exc) { System.out.println("输入的不是合法的数!"); return; // TODO: handle exception } Shuixianhua2 sxh=new ...

    java常用方法大全

    int型 Integer.parseInt(字符串) long型 Long.parseLong(字符串) float型 Folat.valueOf(字符串).floatValue() double型 Double.valueOf(字符串).doubleValue() 4、将数值转化为字符串 valueOf(数值) 5、字符...

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 /** * 享元模式(预加载单例) ... * Integer.valueOf() 、Long.valueOf() * 当数字范围超出, short 1字节 (-128 、+127),生成模式为 new 新对象

    Java编码规范总结

    修复建议:使用Integer.valueOf()替代new Integer。 2.switch语句包含太少分支。 修复建议:分支比较少的时候建议使用if else。原因:switch用来处理多分支的情况。 3.Switch语句应该包含一个default。 4.多...

    java编的简单计算器

    int nu=Integer.parseInt(String.valueOf(nu2)); while(nu&gt;1){ nu1=nu1*num;nu--;} jt.setText(String.valueOf(nu1)); } j=0; st1=e.getActionCommand(); } }...

    java哈夫曼压缩

    public void Huff()throws IOException { System.out.print("程序正huff运行!"); String s;... value[1][i]=Integer.parseInt(s); valueNode[0][i]=i; valueNode[1][i]=Integer.parseInt(s); }

    JAVA初学者,gui实现简单计算器

    package GUI; import java.awt.*; import java.awt.event.*; public class TFMathTest extends Frame{ TextField num1;... new TFMathTest().launchFrame();... tfmt.sum.setText(String.valueOf(i1 + i2)); } }

    64进制任意转换

    if(Integer.valueOf(input3).intValue()==0){ editText2.setText("0"); }else { Long tmp = N_to_10(input3, input1); String tmp2 = _10_to_N(tmp, input2); String newStr = tmp2.replaceFirst("^0*", ""); ...

    Java 用法明细介绍

    int型 Integer.parseInt(字符串) long型 Long.parseLong(字符串) float型 Folat.valueOf(字符串).floatValue() double型 Double.valueOf(字符串).doubleValue() 4、将数值转化为字符串 valueOf(数值) 5、字符...

    java编写智能合约-简单的用java代码实现智能合约.pdf

    byte [] buffer = new byte[Integer.parseInt(String.valueOf(file.length()))]; FileInputStream fis = new FileInputStream(file); int size = Integer.parseInt(String.valueOf(file.length())); int offset; ...

    java模拟telnet链接

    new TelnetConnectionUtil(SDKNode.nodeVo.getIp(),SDKNode.nodeVo.getPassword(),Integer.valueOf(SDKNode.nodeVo.getPort())); java模拟telnet链接,获取信息,进行各种解析。什么地方开始,什么地方结束。

    gedebahe.rar_Break In

    String inputLine = in.readLine() a = Integer.valueOf(inputLine).intValue() }catch (Exception exc) { System.out.println("Sorry,please input a number.") return } if (a%2!=0) { System.out.println("Sorry,...

    java仓库管理

    supplierData.put(Integer.valueOf(resultSet.getInt("sup_id")), resultSet.getString("sup_name")); } catch (Exception e) { e.printStackTrace(); } return supplierData;//返回映射关系 } public ...

    fusionCharts dragnode demo

    List&lt;OperationLog&gt; list2 = genMap.get(Integer.valueOf(key)); //本层的所有节点 if(list2!=null){ for(OperationLog log : list2){ ret.add(log); System.out.println("&gt;&gt;level = "+key+",...

Global site tag (gtag.js) - Google Analytics