2014-06-11 147 views
3

在下面的例子中,将创建多少个对象?并解释关于相同的逻辑?多少个对象创建

class test { 
    public static void main(String args[]) { 

     // 1 Integer Object 
     Integer i=10; 

     // 1 Integer Object 
     Integer j=10; 

     // sum of Integer Object 
     Integer k=i+j; 
    } 
} 

据我所知,它会创建2个对象。 Integer i = 10时内部转换为Integer.valueOf(10),然后调用Integer的valueof方法,这些方法在内部调用IntegerCache,并通过创建对象并将其存储在缓存中。类似于j,它已被缓存它指向相同的对象,那么k对象将被创建。所以总共2。

但有人说整数值在-127到+128之间我们会从缓存中获取对象。 Integer i = 10时内部转换为Integer.valueOf(10),然后调用Integer的valueof方法,并在内部调用IntegerCache并通过缓存获取对象。类似于缓存中的j。和K值20也来自缓存。所以对象将是零。

所以我不知道它是否是0或2

如果有谁知道请告诉我。

回答

4

零是正确的,所有这些整数将被从缓存中拉出。

如果您将其更改为new Integer(10),则会创建一个新对象。

如果您更改了i,j和/或k,以便它们没有缓存值,则会再次创建新对象。

嗯,实际上它比这更复杂一点。无论缓存是否已经被创建,或者是否需要延迟填充,都取决于JVM的实现。从你的代码的角度来看,虽然不可能区分它们,但它没有区别。

+2

这意味着JVM已经包含整数范围从-127到128的缓存对象。我是否正确?\ – Mahesh

+0

@ user3729324我刚刚在最后添加了一条警告。不同的JVM被允许以不同的方式处理,我相信 –

+0

似乎jvm肯定会将整数从'-127到128'(包含)缓存起来,尽管对于这个范围以外的值我们不能这么说。 – Shail016

1

但有人说整数值在-127到+128之间我们会从 中获取缓存中的对象。整数i = 10时它内部转换为 Integer.valueOf(10),然后调用Integer的方法value和 这些在内部调用IntegerCache并通过缓存获取对象。来自缓存的j的 相似。和K值20也来自缓存。因此对象 将为零。

这是真的,它的缓存:看到裁判:Integer valueOf(int i)

,如果你在源去,你可以找到:

/** 
    * Returns an {@code Integer} instance representing the specified 
    * {@code int} value. If a new {@code Integer} 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. 
    * 
    * This method will always cache values in the range -128 to 127, 
    * inclusive, and may cache other values outside of this range. 
    * 
    * @param i an {@code int} value. 
    * @return an {@code Integer} instance representing {@code i}. 
    * @since 1.5 
    */ 
    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); 
    } 

希望你有你的答案吧。