【发布时间】:2014-05-26 05:53:05
【问题描述】:
我有一个非常基本的问题。 在java中(或者我认为对任何类似的语言都有效),从数组中检索元素的时间是多少。由于数组的大小及其元素类型在编译时是已知的或在运行时计算的,我相信检索应该在恒定时间内发生,O(1)。例如,
int[] arr = new int[10];
虽然我不确定数组的内部存储器表示,但我认为像 arr[3] 这样的操作应该在从数组起始地址、元素类型的大小(此处为 32)和传递的索引(此处为 3)计算地址后直接访问内存) 如下所示:
address of arr[3] = address of a[0] + 32 * 3.
感谢您的帮助。
【问题讨论】:
-
如果内存服务,这实际上非常接近于 C/C++ 中数组访问的发生方式。我不确定 Java 在内部做了什么,但我相当肯定数组访问总是 O(1)
-
你能给我指出一些这样说的链接吗?
-
不确定这有多大帮助,但有this。我认为这是与语言无关的事情——您需要做的就是执行一些数学运算,将其添加到指针中,然后就可以找到索引了。
-
在编译时不需要知道数组的大小。例如,编译器无法告诉您
new int[(int) System.currentTimeMillis() / 1000]的大小。 -
同意@johncip,在java中,数组的至少大小不需要是编译时常量。不错的收获。尽管值是在运行时计算的并且内存分配是在运行时发生的,但从讨论到现在,访问时间似乎是恒定的。