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