学习笔记Hashtable源码学习

学习笔记


Hashtable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable 继承Dictionary类,实现了顶级接口Map接口,实现了Cloneable,Serializable接口
private transient Entry<?,?>[] table 底层采用Entry数组来存储数据
private transient int count Hashtable中存储的数量
private int threshold Hashtable的临界值
private float loadFactor 负载因子
transient int modCount = 0 Hashtable被修改的次数,默认为0
Hashtable(int initialCapacity, float loadFactor) Hashtable的构造函数,initialCapacity用来指定存储的数量,loadFactor用来指定自定义负载因子
public Hashtable() {
this(11, 0.75f);
} Hashtable默认大小为11
synchronized boolean contains(Object value) 判断当前所有元素中是否包含value
HashMap线程不安全,HashTable是线程安全的。HashMap内部实现没有任何线程同步相关的代码,所以相对而言性能要好一点。如果在多线程中使用HashMap需要自己管理线程同步。HashTable大部分对外接口都使用synchronized包裹,所以是线程安全的,但是性能会相对差一些。

二者的基类不一样。HashMap派生于AbstractMap,HashTable派生于Dictionary。它们都实现Map, Cloneable, Serializable这些接口。AbstractMap中提供的基础方法更多,并且实现了多个通用的方法,而在Dictionary中只有少量的接口,并且都是abstract类型。

key和value的取值范围不同。HashMap的key和value都可以为null,但是HashTablekey和value都不能为null。对于HashMap如果get返回null,并不能表明HashMap不存在这个key,如果需要判断HashMap中是否包含某个key,就需要使用containsKey这个方法来判断。

算法不一样。HashMap的initialCapacity为16,而HashTable的initialCapacity为11。HashMap中初始容量必须是2的幂,如果初始化传入的initialCapacity不是2的幂,将会自动调整为大于出入的initialCapacity最小的2的幂。HashMap使用自己的计算hash的方法(会依赖key的hashCode方法),HashTable则使用key的hashCode方法得到。
如果在单线程的环境中建议使用HashMap,HashMap性能更好一些。

如果是多线程环境也不建议使用HashTable,而是使用ConcurrentHashMap,ConcurrentHashMap也是线程安全的,并且比HashTable性能好。

HashMap在确定数据大小的情况想,建议初始化一个合适的容量,否则可能会面resieze,resize操作是一个非常耗时的过程。

如果把自定以的类作为HashMap或者HashTable的key,就需要重写hashCode和equals方法。

发布了16 篇原创文章 · 获赞 1 · 访问量 420

猜你喜欢

转载自blog.csdn.net/qq_39898191/article/details/98871457