1

可能重复:
整数数组如何在 JVM 内部存储?

在 C# 中,当您创建一个作为引用类型的新数组时,它会将指针放在 Stack 上,并将对象本身放在 Heap 中。如果您使用简单的原始类型(例如 , 等)创建此数组intdouble那么它所做的就是将值准确地放在它们在堆中放置的位置,而不是指向另一个存储其内容的堆地址的指针。

那么有人可以解释一下这在Java中是如何发生的吗?JavaInteger一直在数组中使用(引用类型)还是像 C# 一样对待值类型?

int[] hello = new int[5];
hello[0] = 2; // C# put this value directly in same slot and doesn't 
//create a wrapping object.

我知道 C# 没有的称为 Java 中的包装类型的东西。C# 具有自动装箱功能,但Int32可以说不是引用类型,而是ValueTypeasInteger是对象而不是int. 您可以使用Object o = 5;或者如果 struct 确实有一个父类来装箱一个值,您也可以使用它来将它包装在堆中(装箱)。

4

3 回答 3

3

Java与您描述的大致相同。

int[] hello = new int[5]; // reference hello is on stack, the object is on the heap.
hello[0] = 2; // Java puts this value directly in same slot and doesn't 
              // create a wrapping object.
于 2012-05-30T16:59:31.540 回答
2

Java 原始数组作为原始数组存储在堆中,而不是整数等。我不相信它们存储方式的实际实现是指定的,因此 boolean[] 很可能由 int[] 实现记忆

于 2012-05-30T16:58:07.880 回答
1

在Java中,无论是保存原始变量还是对象类型,Array都被视为一个Object,在Java中,Array只有一个实例变量,称为length。

int[] arr = new int[5];

arr here is an object reference array variable, which is stored on the STACK if its used Inside the method(ie as local variable), But if its used as an instance variable, then its stored inside the object on the Heap.

于 2012-05-30T18:41:16.833 回答