2013-07-30 27 views
0

我試着檢查Set的keySet()方法的子類型是否返回,並檢查它是否是HashSet的實例,但它不是。HashMap的keySet()返回Set的子類型是什麼?

由於我有一大組密鑰並大量使用keys.contains(),所以如果它不是HashSet類型,則該方法使用起來可能很昂貴,並且它確實減慢了我的程序。

那麼你知道keySet()方法返回的子類型是什麼嗎?任何編程方式來檢查「Set set」實例的具體類型?我想我可能會單獨將它變成一個HashSet,但會使用更多的內存。

編輯:所以我查了一下。它是AbstractSet,那麼AbstractSet在containsKey()中使用什麼樣的機制?如果它遍歷所有元素並找到密鑰,則它非常昂貴。你認爲爲他們的密鑰創建一個單獨的HashSet是個好主意嗎?

最終編輯:好的,徹底檢查源代碼。它確實使用散列機制來檢查密鑰的存在。對於那些誰不知道爲什麼我問:。

+1

您是否檢查過'keySet'的源代碼? –

+2

或者只是調用'.getClass()'並打印出來? –

+0

或者在IDE調試器中檢查它 –

回答

2

我的程序需要永遠運行:(現在正試圖調整它這是內HashMap定義的私有內部類叫KeySet,你可以看到,如果你take a look

KeySetcontains方法僅調用地圖的containsKey(這是O(1)而不是在所有昂貴):

896 public boolean contains(Object o) { 
897  return containsKey(o); 
898 } 
2

HashMap#keySet的javadoc解釋說,這個集是在地圖上的密鑰的意見是,由於該馬。 p實現保證獲取操作的持續時間性能,您可以放心地期望keySet返回的Set提供類似的性能保證。

如果您不相信常識,您可以直接致電map.containsKey

相關問題