2016-10-21 1 views
2

列{item、quantity}の配列があるとします。私はこれらの値をSQLテーブルから取得してから、アイテムごとに並べ替えます。私は二重の値を操作するために、一時的な変数「数量」を使用しています:一時変数を使用して配列内の値を操作する

while(rs.next()){ 
    item = rs.getString(1); 
    for(int i = 0 ; i < array.size ; i++){ 
    if(item.equals(array[i][0]){ 
     double quantity = rs.getDouble(2); 
     quantity = quantity + Double.parseDouble(array[i][1]); 
     array[i][1] = quantity; 
    } 
    } 
//add code for adding items if not found in array 
} 

私の質問は、それが配列を繰り返し処理しながら、遅く/ゴミを作成することが、この一時的な変数を使用しますか? Javaはif文の最後にこの変数を適切に処理しますか?私はヒープスペースに問題があるので私は尋ねています、そして、私はこれに対応するためにすべてを書き直す必要はありません。

私の他のオプションがある:古い値が配列で、もちろん維持されるときには常に、新しい値で数量を上書きします

+2

[ループの内部または外部の変数を宣言する]の可能な複製(http://stackoverflow.com/questions/8803674/declaring-variables-inside-or-outside-of-a-loop) – acm

+2

A変数*ゴミを作りませんし、遅くなることはありません。特に、あなたのケースでは、値が明示的に指定されていないことがあるので、 'quantity'という名前の変数が良い場合があります。つまり、あなたの2番目の例を見てください。何が起こっているかについては非常に情報がありません。コメントはそれを助けるかもしれませんが、名前のついた変数もそうです。 --- *参考:*あなたの最初の例は 'String.valueOf()'呼び出しがありません。 – Andreas

+0

「A _variableはプリミティブであり、ガベージを作成しません」と言う方が正確かもしれません。オブジェクトである変数は、ヒープ上に割り当てられたメモリを持ち、ガーベジコレクションされる必要があります。 – mangotang

答えて

0

を読み取るための

if(item.equals(array[i][0]){ 
    array[i][1] = String.valueOf(Double.parseDouble(array[i][1]) + rs.getDouble(2)); 
} 

感謝。数量はあなたの記憶に特に影響を与えません。これは特に原始的です。

複雑な型を扱う場合、そのようなことをすると、すべてのループでオブジェクトへの参照がオーバーライドされるため、配列内では同じオブジェクトへのすべての時間参照が行われます。

+0

それはほとんど意味がありません。 'quantity'という名前の変数はifブロックの中で*宣言されているので、ブロック内にのみ存在するので、ループ中に値がオーバーライドされません。配列の値が明示的にオーバーライドされているため、「古い値は保持されます」とは間違っています。 – Andreas

+0

Andreasは、ifブロックが終了したときに変数を破棄しなければならないという点で正しいです。この変数がどうにかしてゴミを追加するかどうか疑問に思っています。マンゴンは、プリミティブはゴミを生み出さず、オブジェクトだけが生まれると言っています。この場合、私は頭のスペースの問題を回避する方法を見つけるために書き直す必要があります。 – HagstromV

+0

あなたは正しいです、私は間違った文章を使用した、それは混乱する可能性があります。ヒープサイズの問題では、ブロック内のプリミティブ変数はヒープではなくスタックメモリ上にあるため、問題には影響しません。 –

関連する問題