假设有一个数组声明:
int [] a = new int[3];
我正在读一本书,它说我们需要在运行时显式创建数组的原因是因为我们不知道在编译时要为数组保留多少空间。那么,在上面的这种情况下,我们不知道我们需要保留底层 java 平台的 int 大小的 3 倍吗?
假设有一个数组声明:
int [] a = new int[3];
我正在读一本书,它说我们需要在运行时显式创建数组的原因是因为我们不知道在编译时要为数组保留多少空间。那么,在上面的这种情况下,我们不知道我们需要保留底层 java 平台的 int 大小的 3 倍吗?
那么,在上面的这种情况下,我们不知道我们需要保留底层 java 平台的 int 大小的 3 倍吗?
好吧实际上比这多一点 - 因为数组是具有类引用以及长度的对象。
但是,是的,在这种情况下,您碰巧事先知道尺寸。但 Java 也允许您编写:
int[] a = new int[getLengthFromMethod()];
...在这种情况下,不,在编译时不会知道内存量。这种灵活性使得使用数组比在编译时必须知道大小要简单得多。(例如,想象一下尝试以ArrayList
其他方式工作。)
但请记住,Java 中的内存分配通常是非常动态的 - 它实际上只是预先知道的堆栈帧的大小,然后只是相对而言(因为引用的大小可能因平台而异)。所有1 个对象都分配在堆上,并使用引用来跟踪它们。
1好的,除了智能 JVM,它们有时能够在执行逃逸分析后进行内联分配。
在那本书中,它可能说在某些情况下,您在编译时不知道数组有多大(例如:当您向用户询问一组数字时,您不知道他将插入多少个数字)。
在您的示例(int [] a = new int[3]
)中,您显然知道编译时数组的大小;是 3。
是的。你的正确。
3 * sizeOf(int) + array overhead.
您正在保留那么多内存,然后将指向第一个位置的指针传递给变量 a。然后可以找出如何根据存储的位置和大小来索引数组。
在您的情况下,数组的大小是 3。方括号内的数字是大小。在 www.codejava.co.uk 上查看本周关于数组的教程
您确定您正在阅读的那本书是关于 Java 的吗?
与 C/C++ 不同,Java 没有这种困境 - 数组总是在运行时分配,即使您在编译时知道它们的大小。