2014-09-21 94 views
0

根據該問題插入順序:How to preserve insertion order in HashMap?同時保留的HashMap&教程樣品

HashMap中不保證作爲對地圖的順序;特別是, 它並不保證訂單會隨着時間的推移保持不變。

但後來我有一個關於一個Oracle教程

public void updateCoffeeSales(HashMap<String, Integer> salesForWeek) 
    throws SQLException { 
    ... 
    try { 
     ... 
     for (Map.Entry<String, Integer> e : salesForWeek.entrySet()) { 
      updateSales.setInt(1, e.getValue().intValue()); 
      updateSales.setString(2, e.getKey()); 
      updateSales.executeUpdate(); 
      updateTotal.setInt(1, e.getValue().intValue()); 
      updateTotal.setString(2, e.getKey()); 
      updateTotal.executeUpdate(); 
      con.commit(); 
     } 
    } catch (SQLException e) { 
     ... 
    } finally { 
     ... 
    } 

這是從這裏的問題:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

他們怎麼知道,updateSales &值updateTotal不會混淆?

回答

1

該文檔討論了鍵值對的相對順序。如果你添加項目

a:b 
c:d 
e:f 

哈希映射,你可以得到他們在你迭代時以任意的順序。例如,你可以得到

c:d 
a:b 
e:f 

但是,這種重新排序不能分解對。換句話說,a將保持與b配對 - 它不會被重新排序以對應於df

當您遍歷地圖的entrySet()時,會得到一個無序對列表。但是,對本身保持配對:如果爲給定密鑰設置了某個值,則無論迭代的順序如何,它都將作爲該密鑰的一對返回。由於不應該依賴數據庫表中項目的自然順序,所以特定的插入順序沒有區別。

+0

看,他們迭代拋出HashMap,並且結果可以以任意順序,就像你說的。但是如果迭代塊中的第一對將用於updateTotal呢?然後,第一對值將用於updateSales,這將是完全錯誤的... – andy007 2014-09-21 09:03:47

+2

@安迪你是什麼意思?演示中的每一對都用於更新銷售額*和*用於更新總額。該表的設置方式使'SALES'列包含上週的值,'TOTAL'包含運行總數。 – dasblinkenlight 2014-09-21 09:04:20

+0

@Andy在'for'循環的** body **中,元素'Map.Entry e'不會改變。 'updateSales'和'updateTotal'在每次迭代中都會使用相同的元素'e'。這個文檔僅僅意味着你從'entrySet()'得到的元素的順序是任意的並且不能保證,但是一旦你得到它們並且開始對它們進行迭代,那麼在迭代過程中**不會改變**。 – ADTC 2014-09-21 09:29:57