2013-03-09 82 views
0

我有一個Cookie管理器類,它通過其域在Map中存儲Cookie列表。大部分時間大小將保持在100以下。多次有效地遍歷地圖

Map<String, CookieList> cookieMap; 

每次我設置cookie進行連接,它需要通過所有域(String)迭代,檢查它是否可以接受,然後插入CookieList。我將多次遍歷地圖。我有一個單獨的列表保存域和搜索,然後通過密鑰獲得CookieList

List<String> domainList; 

// host is from the connection being set up 
for (String domain : domainList) { 
    if (host.contains(domain)) { 
     CookieList list = cookieMap.get(domain); 
     // set up cookies 
    } 
} 

由於我使用contains,我不能直接得到cookieMap的關鍵。這是一個好方法,還是應該迭代Map的EntrySet?如果是這樣,在這個例子中,LinkedHashMap會很好嗎?

+0

遍歷100個條目並在地圖中查找每個索引的速度非常快。你可能不需要在這裏優化任何東西。 – 2013-03-09 18:12:00

回答

3

除了維護MapList,您可以使用Map.keySet來獲取域。

for (String domain : cookieMap.keySet()) { 
    if (host.contains(domain)) { 
     CookieList list = cookieMap.get(domain); 
    } 
} 

由於for循環爲O(n),對cookieMap的調用爲O(1),所以沒有什麼效率不高的。

+0

因爲Map.get(K)會搜索這個值,而EntrySet'已經有了它,所以循環EntrySet會不會更好? – 2013-03-09 19:09:55

+1

如果您正在使用HashMap實現,則Map.get(K)不會「搜索」該值 - 訪問時間不變。由於性能差異無法忽略,所以我認爲您應該選擇哪種方式更具可讀性。 – ktm5124 2013-03-09 22:31:07

1
Map<String, CookieList> coockieMap = new HashMap<String, CookieList>(); 
for (Map.Entry<Integer, CookieList> entry : coockieMap.entrySet()) { 
    if (host.contains(entry.getKey())) { 
     CookieList list = entry.getValue(); 
    } 
} 

希望這可以幫助你。

1

我覺得你的代碼是相當優化,如果你願意,你可以使用

domainList.retainAll(hosts) 

您的循環,所以停止做一個檢查每一個循環之前。有效地,您的代碼如下所示:

List<String> hostList = new ArrayList<String>(domainList); // we don't want to edit domains 

hostList.retainAll(host); 

for (String hostEntry : hostList) { // I'd rename "host" so I can use it here 
     CookieList list = cookieMap.get(hostEntry); 
     // set up cookies 
} 
+0

我喜歡這個想法,因爲我還需要檢查cookie和url的路徑。 – 2013-03-09 20:09:33