分析のHashtableの原則

    // 初始化,默认初始化大小为11,区别于HashMap的默认初始化大小16
	public Hashtable() {
        this(11, 0.75f);
    }
	
    public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry<?,?> tab[] = table;
		// 直接使用对象的hashCode进行计算对象的数组索引
        int hash = key.hashCode();
		// 保留对象hash值的低7*8+3=59位,对tab数组的长度进行取模,来获取对应的位置索引
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        Entry<K,V> entry = (Entry<K,V>)tab[index];
		// 如果已经存在,就添加到链表的next
        for(; entry != null ; entry = entry.next) {
            if ((entry.hash == hash) && entry.key.equals(key)) {
                V old = entry.value;
                entry.value = value;
                return old;
            }
        }
		// 否则直接进行添加
        addEntry(hash, key, value, index);
        return null;
    }	
	
    public synchronized V get(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
		// 首先计算位置索引,方法和put时的算法保持一致
        int index = (hash & 0x7FFFFFFF) % tab.length;
		// 从该位置获取到Entry对象,并遍历整个链表,判断是否存在和参数key相同的key,有则返回其value
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return (V)e.value;
            }
        }
		// 否则返回null
        return null;
    }
	
	// 返回Hashtable的迭代器,其实和HashMap的iterator相同。HashMap中的iterator只是在Collection集合框架中对迭代器进行了统一
    public synchronized Enumeration<V> elements() {
        return this.<V>getEnumeration(VALUES);
    }

	// Hashtable 的迭代器遍历示例
	Hashtable<String,String> ht = new Hashtable<String,String>();
	ht.put("1", "1") ;
	ht.put("2", "2") ;
	
	Enumeration<String> elements = ht.elements() ; 
	while (elements.hasMoreElements()){
		String str = elements.nextElement() ;
		System.out.println(str);
	}
	

特長:

1.Hashtableスレッドセーフでは、対応する同期synchronizedキーワードに方法のすべての方法を追加します

1記載の相関は、同期化の使用は、処理速度を低下させる、効率はHashMapのより低いです

3. 2 *古い+ 1、HashMapの初期サイズに拡張11の初期サイズは、16であり、拡張子が2の累乗でなければなりません

4.オブジェクトのハッシュ値が直接計算される使用、位置指標を算出するが、最終モジュロ演算が必要と分周器、かかる除算器を使用します。配列の長さのHashMapの形成は、2の電源を確保このようにして算出分割位置指標値、効率を向上させる助けを行う必要があります。しかしもたらしていない、ハッシュを取得した後HashMapを衝突の確率を減少させるために、ハッシュは、データをバックアップヘルプブレークにいくつかの簡単な計算を行う衝突を減らすと同時に、部門を相殺しませんので、データの衝突の可能性を増加します効率。

廃止され5.Hashtable継承された辞書のクラス、Hashtableのも時代遅れ。HashMapのは、クラスAbstractMapから継承されました。しかし、両方の実装には、インターフェースの地図。

 

 

 

 

公開された87元の記事 ウォンの賞賛9 ビュー80000 +

おすすめ

転載: blog.csdn.net/yunzhonghefei/article/details/104064103