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

Integer.valueOf(int)及自动装箱内幕

    博客分类:
  • Java
阅读更多

  Integer为什么要提供功能与new Integer(xx)一样的valueOf(xx)方法呢,看了源代码之后,我发现了惊人的内幕。

public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i); // 缓存里没有则new
    }

   原来,Integer类里定义了一个静态内部类IntegerCache,

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            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() {}
    }

      该类加载后会在内存里缓存若个个Integer对象,默认从-128~127,high可配(XX:AutoBoxCacheMax=200)。调用valueOf(x),当x>=-128且x<=high时直接取缓存里的对象,不用new,不在这个范围的则在堆里new。(注:Long,Integer,Short,Byte,Character,Boolean均实现了常量池)

       我们知道Integer a = 12会发生自动装箱(int->Integer),实际上是调用了Integer.valueOf(12),用javap验证如下:

localhost:tmp javahongxi$ javap -c T
警告: 二进制文件T包含tmp.T
Compiled from "T.java"
public class tmp.T {
  java.lang.Integer i;

  public tmp.T();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: bipush        12
       7: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      10: putfield      #3                  // Field i:Ljava/lang/Integer;
      13: return        
}

 到此,我们可以得出一个重要的结论:-128~127范围内的整数,我们千万不要用new Integer来声明,请用自动装箱或Integer.valueOf。

最后我们看看equals方法,

private final int value;

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

 现在,我们应该能应对各种关于Integer==判断的笔试题了。

关于字符串的比较请参考String创建详解

0
2
分享到:
评论

相关推荐

    Java Integer.valueOf()和Integer.parseInt()的区别说明

    首先,Integer.parseInt(String s) 将会返回 int 常量,而 Integer.valueOf(String s) 将会返回 Integer 类型。如果存在缓存,将会返回缓存中已有的对象。 在使用这两个方法时,需要注意自动拆箱和装箱机制的影响。...

    【Java学习】Integer.ValueOf()引发的血案

    在Java编程语言中,`Integer.valueOf()`方法是一个关键的知识点,尤其对于理解自动装箱(autoboxing)和拆箱(unboxing)机制至关重要。在Java中,基本类型`int`与封装类`Integer`之间可以自动转换,这就是所谓的...

    Java String转int还有其它几种写法.docx

    当你使用`Integer.valueOf()`时,你会得到一个Integer对象,然后可以通过自动拆箱(unboxing)将其转换为int类型。例如: ```java String str = "100"; int num = Integer.valueOf(str); ``` 自动拆箱意味着`...

    Valueof_JAVA源码_java_

    例如,当我们尝试将一个int变量添加到只能存储对象的集合时,`valueOf`方法会自动被调用来创建一个`Integer`对象。 接下来,我们转向`String`类。`String.valueOf()`方法有多个重载形式,它能将各种数据类型(如...

    day04-常用API&异常1

    反之,将int赋值给Integer时,会自动调用`Integer.valueOf(int)`进行装箱。 了解并熟练运用这些Java API能够极大地提高我们的编程效率和代码质量。在实际开发中,我们还需要注意异常处理,确保程序在遇到错误情况时...

    第7讲 int和Integer有什么区别1

    例如,当我们将`int`赋值给`Integer`变量时,编译器会自动调用`Integer.valueOf()`方法进行装箱;反之,从`Integer`转换为`int`时,编译器会自动调用`intValue()`方法进行拆箱。这种转换在编译阶段就已经完成,使得...

    Java中的自动装箱和拆箱是什么?它们有什么作用?(java面试题附答案).txt

    // 自动装箱,相当于Integer a = Integer.valueOf(10); int b = a; // 自动拆箱,相当于int b = a.intValue(); ``` #### 四、自动装箱与拆箱的注意事项 尽管自动装箱和拆箱带来了诸多便利,但在实际开发中也需要...

    Java中的自动装箱与拆箱_.docx

    // 自动装箱,编译器调用Integer.valueOf(10) ``` 自动拆箱则相反,是将包装类对象转换为原始类型值。这个过程通过调用包装类对象的特定方法实现,如intValue()、doubleValue()等。例如: ```java Integer objNum...

    Java中的自动装箱与拆箱Java开发Java经验技巧共6

    这些包装类都提供了装箱和拆箱的方法,如Integer的`valueOf()`方法用于装箱,`intValue()`方法用于拆箱。 4. 集合与装箱、拆箱 在处理集合(如ArrayList、LinkedList等)时,自动装箱和拆箱尤为常见。当我们向集合...

    Java面向对象(高级)- 包装类(wrapper)的使用

    - 自动装箱与拆箱:Java 5及以上版本引入的特性,编译器会自动进行装箱和拆箱操作,简化代码。 3. 基本数据类型、包装类与字符串`String`之间的转换: - 基本数据类型、包装类 -&gt; `String`类型: - `toString()...

    通过实例了解Java Integer类和int的区别

    在Java中,我们可以直接声明Integer i = 10,这将自动装箱变为Integer i = Integer.valueOf(10);同时Integer i 也可以自动拆箱为 i.intValue()。 知识点2:Integer.valueOf()方法 Integer.valueOf()方法会将int...

    15Java语法糖与Java编译器1

    例如,在Java程序中,我们可以直接将int类型的值放入ArrayList&lt;Integer&gt;,这是因为编译器在背后进行了自动装箱,调用了Integer.valueOf方法。同样,当我们从ArrayList取出一个元素并赋值给int变量时,编译器会进行...

    Java 基础.pdf_电子版pdf版

    public static Integer valueOf(int i) { if (i &gt;= IntegerCache.low && i &lt;= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ``` 总结来说,Java的基础...

    JAVA装箱拆箱(很详细、易于理解)

    Integer i2 = Integer.valueOf("10"); ``` `valueOf()`方法还可以接受一个基数参数,用于解析特定进制的字符串为对应的数值。 拆箱则是通过包装器类的实例方法完成,如`byteValue()`, `doubleValue()`, `intValue...

    java中Integer包装类装箱的一个细节详解

    `时,编译器实际上会自动转换为`Integer i = Integer.valueOf(20);`这一过程称为装箱。同样,当我们使用`int j = i;`时,编译器会处理成`int j = i.intValue();`这就是拆箱。这个机制使得整数对象的使用更加便捷。 ...

    Java软件开发实战 Java基础与案例开发详解 8-3 装箱和拆箱 共4页.pdf

    例如,对于`Integer`类,它提供了`valueOf()`和`intValue()`方法来支持自动装箱和拆箱。 - **装箱**:通过调用`Integer.valueOf(int)`方法实现。 - **拆箱**:通过调用`Integer.intValue()`方法实现。 这些方法...

    Java字符串类型转换

    例如,`Integer`是`int`的包装类,通过`Integer.valueOf(int value)`可以将`int`转换为`Integer`对象,而`Integer.intValue()`则可以将`Integer`对象转换回`int`类型。 ### 结论 Java中的字符串类型转换及其操作是...

    java习题练习

    - 在 Java 5 之后引入了自动装箱和拆箱功能,简化了 Integer 对象与 int 基本类型的转换过程。 - 当使用 `parseInt` 时,会直接返回一个 `int` 类型的值;而 `valueOf` 方法则会返回一个 `Integer` 对象。 #### 2...

    JAVA Integer类型自加实例详解

    最后,调用 java.lang.Integer.valueOf() 方法将 int 类型的值装箱成新的 Integer 对象。因此,变量 a 所指向的对象就不是原来的对象了。 通过这个示例代码和字节码分析,我们可以看到,Java Integer 类型的自加...

Global site tag (gtag.js) - Google Analytics