在學習享元模式過程當中,發現本身的demo和案例代碼效果不一樣,通過多番查找,原來本身誤認爲Hashtable的contains() 、containsKey() 二者等同了,其實不一樣。網上資料也有些有誤。 查看了源碼,一目瞭然:學習
public synchronized boolean containsKey(Object key) { Entry<?,?> tab[] = table; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) { if ((e.hash == hash) && e.key.equals(key)) { return true; } } return false; }
public synchronized boolean contains(Object value) { if (value == null) { throw new NullPointerException(); } Entry<?,?> tab[] = table; for (int i = tab.length ; i-- > 0 ;) { for (Entry<?,?> e = tab[i] ; e != null ; e = e.next) { if (e.value.equals(value)) { return true; } } } return false; }
public boolean containsValue(Object value) { return contains(value); }
經過源碼,能夠知道:Hashtable的contains() 比較的是值,和containsValue()等價,containsKey()顧名思義,就是比較的鍵。spa
另外附加一下其餘類似的用法:code
Hashmap中有兩個:containsValue(),containsKey(),見名知意,不會混淆對象
ArrayList中有兩個:contains() 、containsAll() 集合的元素是單個對象,不是鍵值對,不會有歧義blog