当我们初始化一些整数值时,比如
int a = 10; 或
Integer b = new Integer(20);
Integer b = 30;这些对象是在内存的什么地方创建的?
有没有像Integer-Pool这样的概念,就像我们有String-Pool for String?
发布于 2015-08-07 19:38:31
大多数JVM(甚至64位JVM)都使用32位引用。(较新的JVM对堆使用32位引用,最高可达32 GB)引用位于堆栈或CPU寄存器中,通常不会计算在内。Integer在堆上分配。
Integer i = new Integer(1); // creates a new object every time.
Integer j = 1; // use a cached value.Integer a;将在堆栈中分配内存以保存引用值,并使用null进行初始化
new在heap内存中创建实例
发布于 2015-08-07 19:38:21
使用new关键字创建的对象存储在堆中。
变量(对这些对象的引用)和原始类型(如int )存储在程序的堆栈中。
Integer在Java中并不是一个特殊的类。你可以对它使用算术运算符,它是不可变的,你甚至可以使用==进行相等测试(在-128到127的范围内,因为那些值已经被缓存了)。
有没有像整型池这样的概念,就像我们的String-Pool那样?
打开java.lang.Integer的代码并查看valueOf方法。很明显,他们确实使用了Integer池。
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);
}另外,我认为这张图片会对你有所帮助:

发布于 2015-08-07 19:32:26
-128到+127范围内的Integer是预先创建的。你可以把它们想象成一个“整数池”。
任何其他值都是在运行时创建的。
这导致了Java中的一些微妙行为:
如果两个Integer值foo和bar的值相等且在-128到+127的范围内,则其表达式boo == far将为true。超出这个范围的值就不是真的了:对于这样的值,您需要使用.equals。
就我个人而言,我发现这是有害的:从不在装箱类型上使用==。
https://stackoverflow.com/questions/31876668
复制相似问题