在学习享元模式过程中,发现自己的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()顾名思义,就是比较的键。
另外附加一下其他相似的用法:
Hashmap中有两个:containsValue(),containsKey(),见名知意,不会混淆
ArrayList中有两个:contains() 、containsAll() 集合的元素是单个对象,不是键值对,不会有歧义