Hashtable 分析

一、类图

       Hashtable 分析

二、分析

       a.  不允许 null key 或 null value

       b.  iterator is fail-fast

       c.  Hashtable 是同步的,但 jdk 建议使用 ConcurrentHashMap

       d.  Hashtable 没有强制 capacity 为 2 的整数次幂

    public Hashtable(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal Load: "+loadFactor);

        if (initialCapacity==0)
            initialCapacity = 1;
        this.loadFactor = loadFactor;
        table = new Entry<?,?>[initialCapacity];
        threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
    }

      e.   默认大小 11,load factor 0.75

       f.   index 计算方法,就是求余法

        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;

      g.  所谓线程安全,就是在方法声明中添加了 synchronized 关键字

    public synchronized V get(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 (V)e.value;
            }
        }
        return null;
    } 

      h.  扩容算法

int newCapacity = (oldCapacity << 1) + 1; 

       i.  table 只扩不缩,HashMap 也是只扩不缩,能少  rehash 就少 rehash 吧