2016-10-21 41 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語句的末尾是否正確地處理了這個變量?我在問,因爲我有堆空間的問題,我不想爲了適應這個而重寫所有的東西。

我的另一種選擇是:

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

感謝您閱讀

+2

[在循環內部或外部聲明變量]的可能重複(http://stackoverflow.com/questions/8803674/declaring-variables-inside-or-outside-of-a-loop) – acm

+2

A *變量*不會造成垃圾,並且不會變慢。它可能會澄清代碼,特別是在你的情況下,由於該值是未命名的,因此名爲'quantity'的變量更好是這種情況。我的意思是,看看你的第二個例子。對於正在發生的事情,這是非常不明智的。評論可能會有所幫助,但名稱變量也是如此。 --- * FYI:*您的第一個示例缺少'String.valueOf()'調用。 – Andreas

+0

可能更確切的說「一個原始的變量_不會產生垃圾」。作爲對象的變量將在堆上分配內存,並且需要進行垃圾回收。 – mangotang

回答

0

它總是會覆蓋新的價值,數量時,舊值將在陣列中保持當然。數量不會影響你的記憶,特別是這是原始的。

如果你將處理複雜類型,你會做這樣的事情,你會用每個循環覆蓋對象的引用,所以在數組中你將有所有時間引用同一個對象。

+0

這沒什麼意義。名爲'quantity'的變量在if塊中被聲明爲*,因此它在循環期間不會被*覆蓋*,因爲它只存在於塊內。數組值明確被覆蓋,所以說「舊值將保持」是錯誤的。 – Andreas

+0

Andreas是正確的,因爲當if塊被退出時變量應該被銷燬。我想知道如果這個變量會以某種方式添加垃圾。 mangotang說,原始不會造成垃圾,只有一個對象會;如果是這種情況,我需要重寫以找到解決我的頭部空間問題的方法。 – HagstromV

+0

你是對的,我使用了錯誤的句子,它可能會令人困惑。對於我可以添加的堆大小問題,塊內的原始變量在堆棧內存中,而不是在堆中,所以它可能不會影響您的問題。 –