Hashtable源码学习

    xiaoxiao2021-03-25  55

    Hashtable是线程安全的;先看其构造方法

     /**      * Constructs a new, empty hashtable with a default initial capacity (11)      * and load factor (0.75).      */     public Hashtable() {         this(11, 0.75f);     }

    初始大小为11,扩容百分比为0.75;

    另外研究期put方法

        /**      * Maps the specified <code>key</code> to the specified      * <code>value</code> in this hashtable. Neither the key nor the      * value can be <code>null</code>. <p>      *      * The value can be retrieved by calling the <code>get</code> method      * with a key that is equal to the original key.      *      * @param      key     the hashtable key      * @param      value   the value      * @return     the previous value of the specified key in this hashtable,      *             or <code>null</code> if it did not have one      * @exception  NullPointerException  if the key or value is      *               <code>null</code>      * @see     Object#equals(Object)      * @see     #get(Object)      */     1.public synchronized V put(K key, V value) {         // Make sure the value is not null      2   if (value == null) {             throw new NullPointerException();         }         // Makes sure the key is not already in the hashtable.      3  Entry tab[] = table;      4 int hash = hash(key);     5    int index = (hash & 0x7FFFFFFF) % tab.length;      6   for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {      7       if ((e.hash == hash) && e.key.equals(key)) {      8           V old = e.value;      9           e.value = value;     10          return old;             }         }     11   modCount++;     12  if (count >= threshold) {             // Rehash the table if the threshold is exceeded     13        rehash();     14        tab = table;     15       hash = hash(key);     16       index = (hash & 0x7FFFFFFF) % tab.length;     17    }         // Creates the new entry.      18   Entry<K,V> e = tab[index];      19   tab[index] = new Entry<>(hash, key, value, e);      20  count++;      21   return null;     }

    第1行表明它的并发是通过synchronized来加锁;第2行描述value值不能为空;

    第4行得到其hash值;第5到10计算put的逻辑过程;

    第11-17表明当容量超过因子时,进行扩容的计算;

    我的学习暂时到此

    转载请注明原文地址: https://ju.6miu.com/read-40990.html

    最新回复(0)