2012-08-05 89 views
0

假设有一个数组声明:这个声明在Java中意味着什么?

int [] a = new int[3]; 

我读了一本书,说我们需要在运行时明确创建数组的原因是因为我们无法知道多少空间保留在编译时数组。所以,在上面的例子中,我们不知道我们需要保留底层java平台的int大小的3倍吗?

+0

你可以参考一下什么书? – 2012-08-05 23:11:07

回答

2

在这本书中,它可能会说有些情况下,在编译时您不知道数组的大小(例如:当您向用户询问一组数字时,您不知道有多少他将插入数字)。

在你的例子中(int [] a = new int[3])你显然知道编译时数组的大小;它是3.

+1

因此,如果我们知道数组的大小,就像在这种情况下一样,它会在编译时分配正确吗? – Phoenix 2012-08-05 23:20:30

+0

我upvoted你的评论,意思是:是 – Razvan 2012-08-05 23:24:01

0

是的。你的正确。

3 * sizeOf(int) + array overhead. 

您正在保留那么多的内存,然后将一个指针移到变量a的第一个位置。然后,可以根据存储的位置和大小找出如何索引数组。

+1

实际上一个int元素有三个元素可能需要*至少* 24字节(8字节的对象开销,4字节的长度和12字节的数据本身)。 – 2012-08-05 23:13:24

+0

@JonSkeet感谢您的分手。我没有想到这个细节。我需要了解开销是如何计算的。它总是一个静态的8字节? – 2012-08-05 23:18:00

+0

它取决于JVM,可能取决于体系结构(32位或64位)。哦,并且JVM也可能决定根据实现细节对数据进行不同的调整。 – 2012-08-05 23:18:44

5

因此,在这种情况下,我们不知道我们需要保留底层java平台的int大小的3倍吗?

实际上,稍微多一点 - 因为数组是带有类引用的对象,以及长度。

但是,是的,在这种情况下您恰好提前知道大小。但是,Java也可以让你写:

int[] a = new int[getLengthFromMethod()]; 

...在这种情况下没有,内存量不会在编译时已知的。这种灵活性使得使用数组比在编译时必须知道大小更简单。 (想象一下,例如,试图使ArrayList以其他方式工作)。

但请记住,一般情况下,Java中的内存分配非常动态 - 它实际上只是事先已知的堆栈帧的大小,相对而言(因为参考的大小可能因平台而异)。全部对象分配在堆上,引用用于跟踪它们。


好的,除了智能JVM中其有时能够执行逃逸分析后分配的内联。

-2

你确定你正在阅读的书是关于Java?与C/C++不同,Java不存在这种困境 - 即使在编译期间知道它们的大小,也总是在运行时分配数组。

0

在你的情况下,数组的大小是在方括号中3,号码的size.CHeck这个星期教程关于www.codejava.co.uk阵列