在java中,数组保存在内存中的什么位置?

2022-09-03 18:06:40

如果我有一个函数,在该函数中我声明:

Object arr[] = new Object[20];

arr 和整个阵列存储在哪里?堆?叠?声明是在某些函数中还是在main()中重要吗?

假设我也有这些命令行:

arr[0] = new String("abc");
arr[1] = new List();

存储在哪里?arr[0]arr[1]


答案 1

内存图:

Memory diagram

盒子是内存位置(可以存储二进制数的位置)。
箭头是内存引用(即指针)。


答案 2

从理论上讲,堆栈具有指向堆中包含数组本身的位置的单个指针。数组本身只是一个指针数组,这些指针也指向堆中包含您引用的对象的位置。

在Java中,你几乎可以指望这样一个事实,即任何时候你说,空间都在堆中创建。一般来说,每次声明变量时,编译器都会在方法的上下文中为该变量保留堆栈空间。对于本机类型,该空间将保存实际字节以表示值。对于对象和数组,该变量将保存内存引用。new ...

因此,例如,以下对象在堆中为它们分配了单独的内存位置:

new Object[20]
new String("abc")
new List() // This contains a reference to an initial array, which is also on the heap.

请注意,在很少的情况下,它比 更可取,因为字符串文本无论如何都会存在于包的内存中,并且字符串是不可变的。没有必要为内存中已存在的字符串的精确副本分配额外的内存。new String("abc")"abc"

在实践中,唯一需要注意的是编译器根本不需要在堆栈上存储局部变量。如果它确定变量的作用域足够短,则可以自由地优化堆栈引用,而只对它使用寄存器。