相同点:
- HashMap和HashTable都是java.util包下的类
- HashMap和HashTable都实现了Map接口,存储方式都是key-value形式
- HashMap和HashTable同时也都实现了Serializable和Cloneable接口
- HashMap和Hashtable的负载因子都是0.75
解释:负载因子(loadFactor),当我们第一次创建 HashMap 的时候,就会指定其容量(如果未明确指定,默认是 16),随着我们不断的向 HashMap 中 put 元素的时候,就有可能会超过其容量,那么就需要有一个扩容机制。所谓扩容,就是扩大 HashMap 的容量,在向 HashMap 中添加元素过程中,如果 元素个数(size)超过临界值(threshold) 的时候,就会进行自动扩容(resize),并且,在扩容之后,还需要对 HashMap 中原有元素进行 rehash,即将原来桶中的元素重新分配到新的桶中。
在 HashMap 中,临界值(threshold) = 负载因子(loadFactor) * 容量(capacity)。
loadFactor 是装载因子(负载因子),表示 HashMap 满的程度,默认值为 0.75f,也就是说默认情况下,当 HashMap 中元素个数达到了容量的 3/4 的时候就会进行自动扩容。 - HashMap与HashTable的部分方法相同,如put,remove等方法
不同点:
- HashMap是非线程安全的,HashTable是线程安全的
HashMap:当进入put方法查看源码时可以发现put方法返回的方法只有个finla修饰,没有任何关于线程的存在。
HashTable:当我们点击进入之后,就能马上看到一个synchronized关键字,表示这个方法在调用的时候不能被其他的线程对象访问。 - HashMap允许null作为键或值,HashTable不允许,运行时会报NullPointerException
- HashMap添加元素使用的是自定义hash算法,HashTable使用的是key的hashCode
- HsahMap在数组+链表的结构基础上,在jdk1.8以后又引入了红黑树,而HashTable没有
- HashMap初始容量为16,HashTable初始容量为11
- HsahMap扩容是当前容量翻倍(左移1位),HashTable是当前容量翻倍+1
- HsahMap与HashTable的部分方法不同
HsahMap有containsKey方法和containsValue方法,但是没有contains方法。而HashTable中只有contains方法。