2012-01-27 118 views
21

Recenlty我看到代码(JAVA)是这样的:(123),Integer.valueOf(123),只是123

myMethod(new Integer(123)); 

我目前正在重构一些代码,并且在小费声纳工具,它的更多的内存友好使用某事像这样:

myMethod(Integer.valueOf(123)); 

然而,在这种情况下,我认为没有什么区别,如果我会用:

myMethod(123); 

我可以理解,如果我将一个变量传递给方法,但硬编码int?或者如果会有长/双等,我想要数字的长表示。但整数?

+4

实际上,如果你使用'myMethod(Integer.valueOf(123))'或'myMethod(123)',自动装箱会为你使用'Integer.valueOf()',这并不重要。为自己判断哪一个更具可读性。 (假设'myMethod'采用'Integer') – soulcheck 2012-01-27 08:59:10

回答

27

new Integer(123)将为每个呼叫创建一个新的Object实例。

按照javadocInteger.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)); 

    } 

具有以下的输出:

a==b? false 
c==d? true 

至于使用int值,您所使用的基本类型(考虑您的方法也使用原始类型) - 它会使用更少的内存,可能会更快,但是例如,您不会将它添加到集合中。

而且看看Java的AutoBoxing如果你的方法的签名使用Integer - 使用时,JVM将自动调用Integer.valueOf()你(因此使用缓存藏汉)。

+1

那么自动装箱总是会创建一个新的对象?或者它也可以利用缓存?如果您将这些信息添加到您的帖子中,我认为您将是最佳答案。 – 2012-01-27 09:22:22

+0

@Marcelo ...你可以请那些信息也是亚历克斯D建议... – 2014-08-28 07:25:12

+1

@MananShah它已经在那里(:是的 - 自动装箱使用'Integer.valueOf()',所以它确实使用缓存。 – Marcelo 2014-08-31 21:12:37

5

public static Integer valueOf(int i)

返回表示指定int值一个整数实例。如果不需要一个新的整数实例,此方法应 通常优先于构造整型(int)的使用,因为 这种方法可能通过缓存经常请求的值 表现得显著更好的空间和时间。

参数:
i - 一个int值。
返回:
a整型实例,代表i
因为:
1.5

参考http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#valueOf%28int%29

在JDK 5加入字节的valueOf的变型,短,Integer和Long(它在布尔琐碎的情况下,因为JDK 1.4已经存在)。所有这些当然都是Java中的不可变对象。曾经是,如果你需要一个int的Integer对象,你会构造一个新的Integer。但是在JDK 5+中,您应该真的使用valueOf,因为Integer现在在-128和127之间缓存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); 
} 

参考Why YOU should use Integer.valueOf(int)

编辑

自动装箱和对象创建:

我们必须考虑的重要一点是,自动装箱不会降低创建对象,但它降低了代码复杂。一个好的经验法则是在不需要对象的情况下使用原始类型,原因有两个:

原始类型不会比它们相应的包装类型慢,而且速度可能会快很多。 可能会有一些意外的行为涉及==(比较引用)和.equals()(比较值)。

通常,当原始类型被装箱到包装类型中时,JVM分配内存并创建一个新对象。但是对于一些特殊情况,JVM重用相同的对象。

以下是存储为不可变对象的图元的列表:

  • 布尔值true和false

  • 所有字节值-128和127

  • 之间

  • 短值

  • int值介于-128和127之间

  • 炭范围\ u0000的到\ u007F

参阅http://today.java.net/pub/a/today/2005/03/24/autoboxing.html#performance_issue

1

int是原语类型,而不是一个对象。

new Integer(123)Integer.valueOf(123)都返回Integer对象表示值123每Javadoc中Integer.valueOf()

返回表示指定int值一个整数实例。 如果不需要新的Integer实例,则通常应该使用此方法优先于构造函数Integer(int),因为此方法为 可能通过缓存 频繁请求的值而产生显着更好的空间和时间性能。

1

您的方法是否需要intInteger

new Integer(int)Integer.valueOf(int)都返回Integer对象,但valueOf应该是首选,因为它是更有效,因为它返回缓存对象。如果您的方法需要Integer,则应使用Integer.valueOf

如果您的方法需要int,您应该使用int(例如123)。

然而,这并非绝对必要以这种方式,因为autoboxing,它会自动的int转换为Integer,反之亦然,当类型不匹配,匹配的类型。这允许您将int转换为需要Integer的方法,并将Integer转换为需要int的方法。但请注意,与自动装箱相关的性能成本。当你使用自动装箱时,最常见的例子就是你想把原语存储在一个集合中。

1

只在-128到+127范围内实现缓存。

Integer a = new Integer(1); 
Integer b = new Integer(1); 

System.out.println("a==b? " + (a==b)); 

Integer c = Integer.valueOf(127); 
Integer d = Integer.valueOf(127); 

System.out.println("c==d? " + (c==d)); 

Integer e = Integer.valueOf(128); 
Integer f = Integer.valueOf(128); 

System.out.println("e==f? " + (e==f)); 

请参阅本Java规范:

http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7

在JDK

5+,你应该使用的valueOf,因为整数现在缓存-128到127之间的整数对象,可以交给你回来完全相同整数(0)对象,而不是在全新的相同Integer对象上浪费对象构造。

相关问题