int值和整数对象在哪里创建?

时间:2015-08-07 11:30:44

标签: java

当我们初始化一些整数值,如

int a = 10; 

Integer b = new Integer(20);
Integer b = 30;

在内存中创建的那些对象在哪里?

是否有像Integer-Pool这样的概念,比如我们有String-Pool for String?

3 个答案:

答案 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

初始化

newheap内存中创建实例

答案 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);
}

此外,我认为此图片对您有所帮助:

enter image description here

答案 2 :(得分:-1)

预先创建了-128到+127范围内的

Integer s。你可以把它们想象成一个&#34;整数池&#34;。

在运行时创建任何其他值。

这导致Java中的一些微妙行为:

两个boo == farIntegerfoo的{​​{1}}表达式bar如果它们的值相等范围-128到+127。对于该范围之外的值,情况并非如此:您需要使用true来表示此类值。

我个人觉得有害:从不在盒装类型上使用.equals