Mic*_*Neo 28 java integer new-operator value-of
我看到代码(Java)是这样的:
myMethod(new Integer(123));
Run Code Online (Sandbox Code Playgroud)
我目前正在重构一些代码,并且在Sonar工具中有一个提示,使用这样的内存更友好:
myMethod(Integer.valueOf(123));
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下,我认为如果我使用的话没有区别:
myMethod(123);
Run Code Online (Sandbox Code Playgroud)
我能理解,如果我将一个变量传递给该方法,但是硬编码为int?或者,如果有长/双等,我想要长数字表示.但是整数?
Mar*_*elo 35
new Integer(123)将为Object每个调用创建一个新实例.
根据javadoc,Integer.valueOf(123)它有很大的不同,它会缓存对象...所以Object如果你多次调用它,你可能(或可能不会)最终得到它.
例如,以下代码:
   public static void main(String[] args) {
        Integer a = new Integer(1);
        Integer b = new Integer(1);
        System.out.println("a==b? " + (a==b));
        Integer c = Integer.valueOf(1);
        Integer d = Integer.valueOf(1);
        System.out.println("c==d? " + (c==d));
    }
Run Code Online (Sandbox Code Playgroud)
有以下输出:
a==b? false
c==d? true
Run Code Online (Sandbox Code Playgroud)
至于使用该int值,您使用的是原始类型(考虑到您的方法也在其签名上使用原始类型) - 它将使用稍微更少的内存并且可能更快,但您不会将它添加到集合中,例如.
如果您的方法的签名使用,请查看Java的AutoBoxingInteger - 使用它时,JVM将自动Integer.valueOf()为您调用(因此也使用缓存).
public static Integer valueOf(int i)返回表示指定int值的Integer实例.如果不需要新的Integer实例,通常应优先使用此方法,而不是构造函数Integer(int),因为此方法可能通过缓存频繁请求的值来显着提高空间和时间性能.
参数:
i- 一个int值.
返回:
a表示的整数实例i.
自:
1.5
参考http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#valueOf%28int%29
这个valueOf的变体在JDK 5中被添加到Byte,Short,Integer和Long(从JDK 1.4开始,它已经存在于布尔的普通情况中).当然,所有这些都是Java中的不可变对象.曾经是如果你需要一个int的Integer对象,你需要构造一个新的Integer.但是在JDK 5+中,你应该真正使用valueOf,因为Integer现在可以在-128到127之间缓存Integer对象,并且每次都可以将同一个完整的Integer(0)对象交给你,而不是在全新的相同Integer对象上浪费对象构造.
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
    for(int i = 0; i < cache.length; i++)
    cache[i] = new Integer(i - 128);
}
}
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
    return IntegerCache.cache[i + offset];
}
    return new Integer(i);
}
Run Code Online (Sandbox Code Playgroud)
编辑
自动装箱和对象创建:
我们必须考虑的重点是,自动装箱不会减少对象创建,但会降低代码复杂性.一个好的经验法则是在不需要对象的情况下使用原始类型,原因有两个:
原始类型不会比它们相应的包装类型慢,并且可能要快得多.可能存在一些涉及==(比较引用)和.equals()(比较值)的意外行为.
通常,当基元类型被装入包装类型时,JVM会分配内存并创建一个新对象.但是对于某些特殊情况,JVM重用相同的对象.
以下是存储为不可变对象的基元列表:
布尔值true和false
所有字节值
-128到127之间的短值
int值介于-128和127之间
char在\ u0000到\ u007F范围内
参考http://today.java.net/pub/a/today/2005/03/24/autoboxing.html#performance_issue
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           44991 次  |  
        
|   最近记录:  |