2012-01-15 60 views
4

我正在为内存受限设备编程。因此,我想避免分配任何内存。针对数组迭代的Java语法是否分配内存?

显然,迭代跨集合,列表等将分配一个迭代器,从而分配内存。所以这应该避免。

跨数组迭代的本机java语法是否分配内存?

Object[] array = getArray() 
for(Object elem: array){ 
    //do something 
} 

(我想我可以一直使用老式的for循环与索引变量)。

+3

我不知道可以禁用JVM垃圾收集器。 **在这种情况下**如何工作? – 2012-01-15 14:34:42

+0

...更重要的是,可以称为Java? – delnan 2012-01-15 14:35:10

+0

你是对的,GC没有完全禁用 - 我们只是想避免让它运行,所以我更喜欢这样看。 – jhourback 2012-01-15 14:38:02

回答

4

都能跟得上。在我检查过的所有编译器中,都是由for循环(0..array.lengh-1)实现的。

请注意,Java阵列不实现Iterable。由此可看出,例如,通过下面的代码:

Object[] arr = new String[100]; 
Iterable<?> iter = arr; // Error: 'Type mismatch: 
         //   cannot convert from Object[] to Iterable<?>' 

[UPDATE]

这里是明确的源:http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.2

for循环如

for (VariableModifiersopt Type Identifier: Expression) Statement 

具有以下含义时表达式的类型是T []的数组:

T[] a = Expression; 
for (int i = 0; i < a.length; i++) { 
     VariableModifiersopt Type Identifier = a[i]; 
     Statement 
} 
2

它不分配新的内存。下面的foreach循环:

for (type var : array) { 
    body-of-loop 
} 

等效于此:

for (int i = 0; i < array.length; i++) { 
    type var = array[i]; 
    body-of-loop 
} 

正如你所看到的,没有额外的内存分配正在取得进展。

+2

具体来说,需要一些stak空间类型var = array [i];) – 2012-01-15 14:40:47

+0

那么,'int i'和'type var' _do_分配一些堆栈内存(和一个常量值),但不会分配额外的_heap_内存。 – 2012-01-15 14:51:26