2012-01-15 7 views
4

私はメモリが制約されたデバイスのプログラミングです。したがって、私は任意のメモリを割り当てることを避けたい。明らかに、セット、リストなどを反復すると、イテレータが割り当てられ、メモリが割り当てられます。だからこれは避けるべきです。配列全体の反復処理のためのJava構文はメモリを割り当てますか?

複数の配列を反復処理するネイティブjava構文はメモリを割り当てますか?

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

(私は常にインデックス変数とループのための古風なを使用することができたとします。)

+3

私は、JVMガベージコレクタを無効にすることができないことに気づいていませんでした。どのように**何か**そのシナリオで動作しますか? –

+0

...さらに重要なことに、それをJavaと呼ぶことができますか? – delnan

+0

そうです、GCは完全に無効になっているわけではありません。実行しないようにしたいので、私はそのように見たいと思っています。 – jhourback

答えて

4

いいえ。私がチェックしたすべてのコンパイラでは、ループ(0..array.lengh-1)がforで実装されています。

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

Aよう

としてforループ
for (VariableModifiersopt Type Identifier: Expression) Statement 
T[] a = Expression; 
for (int i = 0; i < a.length; i++) { 
     VariableModifiersopt Type Identifier = a[i]; 
     Statement 
} 
2

それは新しいメモリを割り当てない:発現は、T []型の配列がある場合210には、以下の意味を有します。次のforeachループ:

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

がこれに相当します。あなたが見ることができるように

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

、追加のメモリ割り当ては行われませんされています。

+2

具体的には、型var = array [i];のためのスティッキスペースが必要です –

+0

'int i'と' type var' _do_はスタックメモリ(および定数値)のビットを割り当てますが、追加の_heap_メモリは割り当てられません。 –

関連する問題