Java源码集合类Hashtable学习

Hashtable类简介

java version "1.7.0_67"

        Hashtable类继承了Dictionary抽象类,实现了Map、Cloneable、java.io.Serializable接口,它的底层实现原理和HashMap类是差不多的。Hashtable类最大的一个特点是:线程安全的,对外提供调用的方法都加了同步关键字Synchronized,但同时也降低了性能。插入的“键—值”都不能为null。

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {
1.常用的构造方法HashTable(),默认初始化容量大小11,加载因子0.75
/**
 * Constructs a new, empty hashtable with a default initial capacity (11)
 * and load factor (0.75).
 */
public Hashtable() {
	this(11, 0.75f);
}
2.HasTable中的put(K key, V value)方法,用了synchronized关键字保证线程安全
public synchronized V put(K key, V value) {
	// Make sure the value is not null
	if (value == null) {
		//在HashTable中value不能为null,否则报空指针异常
		throw new NullPointerException();
	}

	// Makes sure the key is not already in the hashtable.
	Entry tab[] = table;
	int hash = hash(key);//key为null则会报空指针异常错误
	int index = (hash & 0x7FFFFFFF) % tab.length;
	for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
		//哈希码值相等并且key值也相等,就会把就的value值替换成新的value值
		if ((e.hash == hash) && e.key.equals(key)) {
			V old = e.value;
			e.value = value;
			return old;
		}
	}

	modCount++;
	//总数量大于等于阀值,那么就需要对数组进行扩容
	if (count >= threshold) {
		// Rehash the table if the threshold is exceeded
		rehash();

		tab = table;
		hash = hash(key);
		index = (hash & 0x7FFFFFFF) % tab.length;
	}

	// Creates the new entry.
	Entry<K,V> e = tab[index];
	//根据索引index处存入新的entry,并且把有一个next引用指向旧的entry
	//连着成一个链表,新插入的都是成为新的链表头
	tab[index] = new Entry<>(hash, key, value, e);
	count++;
	return null;
}

可以看出hash(Object k)方法,计算哈希码值比较的简单,没有像HashMap中的那样做防碰撞处理。

private int hash(Object k) {
	// hashSeed will be zero if alternative hashing is disabled.
	return hashSeed ^ k.hashCode();
}
3.Hashtable 类中的内部类:Enumerator<T>,实现了接口Enumeration<T>和Iterator<T>,主要的用途是对外提供迭代器和枚举器用于遍历Hashtable中的key和value值。

总结:

当前,Hashtable在实际应用中不常用了,多线程访问下被ConcurrentHashMap类所替代了,因为它的性能比Hashtable高。
















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值