2012-11-05 40 views
2

我已經迭代了幾個大小爲20-40項的hashmaps,所以它會更有意義只需在迭代或使用單個get(key)操作時添加if條件?哪種方法可以提高性能。當迭代時使用'if'條件找到一個項目vs使用get(key),當你已經需要迭代時

我知道準確的結果我應該依靠分析結果,但由於我不太熟悉分析,需要專家意見。

編輯:

這裏是我的代碼:

for (HColumn col : lobColumns) {// lobcolumns is a list but I also have hashmap already built containing same elements as this list 
     switch (ByteBufferToInt(col.getName())) { 

      case .......: 
       break; 

      case .......: 
       break; 
      case .......: 
       break; 
      case .......: 
       break; 
      case .......: 
       break;     
     }    
     if (ByteBufferToInt(col.getName()).intValue()==currentUserId()){// here is what I'm using as replacement for hashmap `get()` 
      ..... 
     } 
    } 

lobcolumns是一個列表,但我也有HashMap的已建成含有相同的元素,這個名單。這個列表/映射包含幾個常量&幾個變量對象,對於常量我使用switch case進行高效查找&用於查找單個特殊變量項目,我需要決定是使用散列圖get()還是使用if而已經迭代。

+0

如果您已經遍歷'map',那麼您沒有獲得'map'的性能優勢。在這種情況下,如果必須的話,我認爲如果使用條件比使用另一個在地圖上查找更「好」。 – JavaKungFu

+0

其實我得到一個哈希映射以及列表傳遞的外部庫和我已經需要遍歷列表 –

+0

我不知道你的意思,因爲你的問題沒有說任何關於列表。 – JavaKungFu

回答

5

嗯,我的意思是讓我們來看看它。 get操作是O(1)或恆定時間與完美哈希函數在最壞的情況下。而在最壞的情況下迭代爲O(n)。如果您提前key只需調用get,則不需要遍歷所有內容。

更新

以下行:

for (HColumn col : lobColumns) 

你的意見是,你把所有存儲在HashMap已經這些值。如果地圖被定義爲這樣:外

Map<Integer, HColumn> columns = new HashMap<Integer,HColumn>(); 

if聲明動作的循環,變成:

HColumn column = columns.get(currentUserId());  
if(null != column) 
{ 
    doSomethingWithColumn(column); // this was the old if block 
} 
for(Integer col : columns.keySet()) 
{ 
    switch(col) 
    { 
     ... 
    } 
} 

這減少了,如果只執行一次,因爲它是現在在for循環之外。

+0

如前所述,無論如何需要迭代 –

+1

@ user01是的,但你沒有解釋爲什麼它是需要的。 – Woot4Moo

+0

,因爲我需要在從迭代中獲取每個項目後進行一些計算,並且當我需要在地圖中查找特定項目時存在一個特殊情況。 –

1

如果您使用if語句,那麼它將執行比較多次循環。

HashMap意味着使用散列鍵維護和檢索值,因此非常有效。

我寧願使用get(key)而不是if聲明來避免幾次不必要的比較。

相關問題