Hashtable的contains() 、containsKey()和containsValue() 區別


  在學習享元模式過程中,發現自己的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() 集合的元素是單個對象,不是鍵值對,不會有歧義

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM