在下面的示例中,将创建多少个对象?并解释有关相同的逻辑?
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方法的值,这些内部调用IntegerCache并通过创建它来获取对象并存储在缓存中。类似于j已经缓存它指向同一个对象然后将创建k对象。总共2。
但有些人说Integer的值在-127到+128之间,我们将从缓存中获取对象。对于Integer i = 10,它在内部转换为Integer.valueOf(10),然后调用Integer的valueof方法,这些内部调用IntegerCache并通过缓存获取对象。类似于缓存中的j。和K值20也来自缓存。所以对象将为零。
所以我不确定它是0还是2。
如果有人知道,请告诉我。
答案 0 :(得分:4)
零是正确的,所有这些整数都将从缓存中拉出。
如果您将其更改为new Integer(10)
,则会创建一个新对象。
如果您更改了i,j和/或k以便它们不是缓存值,那么它将再次创建新对象。
嗯,实际上它比那复杂一点。无论是否已经填充了缓存,或者根据需要延迟填充,它都归结为JVM实现。从您的代码的角度来看,虽然无法区分它并且它没有区别。
答案 1 :(得分:1)
但有些人说Integer的值在-127到+128之间 从缓存中获取对象。第一个为Integer i = 10,它在内部转换为 Integer.valueOf(10)然后调用Integer和的方法valueof 这些内部调用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);
}
希望你现在得到答案。