`
gong1208
  • 浏览: 558925 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

我会告诉你我为什么用Integer.ValueOf()而不用new Integer()吗?

阅读更多

我会告诉你我为什么用Integer.ValueOf()而不用new Integer()吗?


问题:当你需要产生一个整形的包装类的实例的时候(比如整数10),有两种方式:

第一种,使用构造函数new 一个对象:

Integer i=new Integer(10);

第二种,使用静态工厂方法产生实例(我会告诉你其实java里所有的ValueOf都是静态工厂方法吗?):

Integer i=Integer.ValueOf(10);

你选哪种?


我选第二种,为什么?因为,当你用第一种方式时每次都会产生一个新的实例,而当你使用静态工厂方法时,不一定会产生一个新的实例,注意我说的是不一定,至少这里没有产生一个新的实例,为什么,我们看源码:


  /**
     * Returns a <tt>Integer</tt> instance representing the specified
     * <tt>int</tt> value.
     * If a new <tt>Integer</tt> instance is not required, this method
     * should generally be used in preference to the constructor
     * {@link #Integer(int)}, as this method is likely to yield
     * significantly better space and time performance by caching
     * frequently requested values.
     *
     * @param  i an <code>int</code> value.
     * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }


 这是Integer.ValueOf(int i)的源码,原来IntegerCache相当于做了一个缓存,在第一次被调用时,首先初始化生成了从-128到127共256个对象的数组,在以后凡是在这个范围内的int值都可以直接从此缓存中取,而不在再次生成Integer对象,大大提高了对象的利用率。 

下面是IntegerCache的源码,这个就不解释了:


 private static class IntegerCache {
        static final int high;
        static final Integer cache[];

        static {
            final int low = -128;

            // high value may be configured by property
            int h = 127;
            if (integerCacheHighPropValue != null) {
                // Use Long.decode here to avoid invoking methods that
                // require Integer's autoboxing cache to be initialized
                int i = Long.decode(integerCacheHighPropValue).intValue();
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - -low);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }


 好了,很清楚了,之前我为什么说不一定不会new 一个新的对象,现在明白了,当你产生的数是-128到127时,不会new一个新的对象,超过这个范围时,同样是new 一个新的对象。

0
0
分享到:
评论
3 楼 须等待 2012-11-15  
个人感觉有点鸡肋,Integer也不是什么很大很占内存的对象弄个缓存感觉没有太多的作用,而且以前遇见过用Integer出了莫名其妙的问题就是因为缓存把Integer变成了共享的单例,这种情况在多线程环境下是非常危险的。
2 楼 gong1208 2012-11-14  
bendan123812 写道
那么为什么这个范围是-128到127呢?

呵呵,这个,源码里就是这么写的,应该是出于性能的考虑,只产生了一个256长度的数组,用于缓存这个范围的数,不然太大或是太小都不合适。
1 楼 bendan123812 2012-11-14  
那么为什么这个范围是-128到127呢?

相关推荐

    用我工作经历总结的java常用方法和注意的问题

    - `int` 转 `String`:使用 `String.valueOf()` 方法,例如 `String sub1=String.valueOf(sub);` - 注意:在进行类型转换时需确保字符串能正确解析为数字,否则会抛出 `NumberFormatException`。 2. **获取本地IP...

    myeclipse7.0

    licenseNum = nf.format(Integer.valueOf(licenseNum)); String verTime = new StringBuilder("-").append( new java.text.SimpleDateFormat("yyMMdd").format(cal.getTime())).append("0").toString(); String ...

    数据库测试test.sql

    Date enterDate = Date.valueOf(strDate); //util.Date SimpleDateFormat //判断两次密码是否相同 if(pwd == null || !pwd.equals(rePwd)){ request.setAttribute("error","两次密码必须相同"); request....

    JAVA期末简答题参考.doc

    - 基本数据类型转字符串:使用 `String.valueOf()`,如 `String str = String.valueOf(123)`。 3. **基本数据类型的封装类** - 封装类是 Java 为每个基本数据类型提供的类,如 `Integer` 对应 `int`,`Double` ...

    src04 Byte

    其中 `parseByte(s, radix)` 方法会首先使用 `Integer.parseInt(str, radix)` 将字符串转换为整数,然后检查转换后的整数是否在 `byte` 类型的范围内。若不在范围内,则抛出 `NumberFormatException`。 ##### 3.5 ...

    java经典面试题.doc

    使用`String.valueOf()`方法或将数字与空字符串拼接。 #### 25. 如何去小数点前两位,并四舍五入。 使用`Math.round()`方法或`DecimalFormat`类。 #### 26. 如何取得年月日,小时分秒? 使用`LocalDate`和`...

    springmybatis

    无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfactory 产生 session 3. 在session 中完成对数据的增删改查和事务提交等. 4....

    sql.rar_SQL 数组

    2. **创建SQL语句**:在SQL查询中,你可以使用`IN`关键字配合`(@p1, @p2, ..., @pn)`来处理数组中的元素。但由于参数化的限制,你不能直接将数组传入SQL,而是需要构造一个动态的SQL语句。这里我们可以使用字符串...

    FindBugs的BUG分类

    * DM:方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似Integer.toString(1)代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。 * SIC:如果一个...

    观看韩顺平Java的 所做的笔记 到互斥锁 其中里面有我很多心得 老手可以用来复习 新手可以用学习 也可以当做参考 来做笔记

    例如,int到Integer的转换可以通过Integer.valueOf()自动完成,反之,Integer到int的转换会自动调用intValue()方法。 2. **String类**: String在Java中是一个不可变类,意味着一旦创建,其内容就不能改变。创建...

    ASP.NET程序中常用的三十三种代码.txt

     不要使用Response.Redirect,而应该使用Server.Transfer  e.g // in global.asax protected void Application_Error(Object sender, EventArgs e) { if (Server.GetLastError() is HttpUnhandledException) Server...

    sesvc.exe 阿萨德

    codeceo 首页问答热门文章RSS订阅 文章首页 ...但是为什么呢?简单分析下。 看过上文的还记得在 HashMap 扩容的时候会调用 resize() 方法,就是这里的并发操作容易在一个桶上形成环形链表;这样当获取...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 apache网站下下载 在这是junit测试单元类我就不提交了,在main()方法中有几个小...

    android数据库操作demo

    ", new String[]{String.valueOf(id)}); } // 更新数据 public int update(int id, String newName, int newAge) { ContentValues values = new ContentValues(); values.put("name", newName); values.put(...

    JSP实现web网页访问次数

    writer.write(String.valueOf(counter)); writer.close(); } catch (IOException e) { out.println("Error updating counter."); } %&gt; &lt;!DOCTYPE html&gt; 访问计数示例 该页面已被访问 &lt;%= counter %&gt; 次。...

    事件编程小结

    - `Integer.valueOf(String s)`:同上,但返回的是`Integer`对象。 - **String to Double** - `Double.parseDouble(String s)`:将字符串转换为双精度浮点数。 - `Double.valueOf(String s)`:同上,但返回的是`...

    ASP.NET常用代码

    不要使用Response.Redirect,而应该使用Server.Transfer e.g // in global.asax protected void Application_Error(Object sender, EventArgs e) { if (Server.GetLastError() is HttpUnhandledException) Server....

    最新JAVA编程题全集_50题及答案

    写一个函数,例如:给你的 a b c 则输出 abc acb bac bca cab cba import java.util.ArrayList; import java.util.List; public class NumTest { public static void main(String[] args) { String s="ABCD";...

    java函数大全

    - **示例**: `Integer.valueOf(123)`返回字符串`"123"`。 #### 字符串检索 - **方法**: `indexOf(String s)` - **功能**: 返回字符串`s`在当前字符串中的首次出现位置;如果不存在,则返回-1。 - **示例**: `...

Global site tag (gtag.js) - Google Analytics