Hashtable源码学习

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表明当容量超过因子时,进行扩容的计算;

我的学习暂时到此



猜你喜欢

转载自blog.csdn.net/hackland2012/article/details/61917347