当我们初始化一些整数值,如
int a = 10;
或
Integer b = new Integer(20);
Integer b = 30;
在内存中创建的那些对象在哪里?
是否有像Integer-Pool这样的概念,比如我们有String-Pool for String?
答案 0 :(得分:2)
大多数JVM(甚至是64位)都使用32位引用。 (较新的JVM使用32位引用,最多可达32 GB的堆)引用位于堆栈或CPU寄存器中,通常不计算在内。整数在堆上分配。
Integer i = new Integer(1); // creates a new object every time.
Integer j = 1; // use a cached value.
Integer a;
将在堆栈中分配内存以保存参考值并使用null
new
在heap
内存中创建实例
答案 1 :(得分:0)
使用new
关键字创建的对象存储在堆。
变量(对这些对象的引用)和基本类型(如int
)存储在程序的堆栈中。
Integer
不是Java中的特殊类。您可以使用算术运算符,它是不可变的,您甚至可以使用==
进行相等性测试(在-128到127的范围内,因为这些值已经被缓存)。
是否有像Integer-Pool这样的概念,比如我们有String-Pool for String?
打开java.lang.Integer
的代码并查看valueOf
方法。很明显,他们确实使用了整数池。
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);
}
此外,我认为此图片对您有所帮助:
答案 2 :(得分:-1)
Integer
s。你可以把它们想象成一个&#34;整数池&#34;。
在运行时创建任何其他值。
这导致Java中的一些微妙行为:
两个boo == far
值Integer
和foo
的{{1}}表达式bar
如果它们的值相等且范围-128到+127。对于该范围之外的值,情况并非如此:您需要使用true
来表示此类值。
我个人觉得有害:从不在盒装类型上使用.equals
。