当我们初始化一些整数值时,例如
int a = 10;
或者
Integer b = new Integer(20);
Integer b = 30;
这些对象在内存中是在哪里创建的?
是否存在像字符串池(String-Pool)一样的整数池(Integer-Pool)的概念?
当我们初始化一些整数值时,例如
int a = 10;
Integer b = new Integer(20);
Integer b = 30;
这些对象在内存中是在哪里创建的?
是否存在像字符串池(String-Pool)一样的整数池(Integer-Pool)的概念?
大多数JVM(即使是64位的)使用32位引用。(新的JVM对于近32GB的堆使用32位引用)引用在堆栈或CPU寄存器中,通常不计算。整数分配在堆上。
Integer i = new Integer(1); // creates a new object every time.
Integer j = 1; // use a cached value.
Integer a;
会在堆栈中分配内存来保存引用值,并初始化为null
new
在heap
内存中创建实例。
new
关键字创建的对象存储在堆上。变量(对这些对象的引用)和原始类型如int
存储在程序的堆栈中。在Java中,Integer
不是特殊的类。您可以使用算术运算符,它是不可变的,甚至可以在-128到127的范围内使用==
进行相等性测试(因为这些值已经被缓存)。像我们对字符串使用的String-Pool一样,是否有类似于Integer-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);
}
此外,我认为这张图片对您会有所帮助:
Integer
在范围-128至+127内是预先创建的。您可以将这些视为位于“整数池”中。
任何其他值都是在运行时创建的。
这导致Java中的一些微妙行为:
对于两个Integer
值foo
和bar
,表达式boo == far
如果它们的值相等且位于-128至+127的范围内,则为true
。对于超出该范围的值,它将不为true:您需要使用.equals
来处理这些值。
就我个人而言,我觉得这种行为很有害:永远不要在包装类型上使用==
。