hashtable 和hashmap 的区别
时间: 2023-11-24 22:49:47 浏览: 65
Hashtable和HashMap都是用于存储key-value键值对的集合,它们的区别如下:
1. 线程安全性:Hashtable是线程安全的,而HashMap是非线程安全的。
2. 性能:由于Hashtable的方法上大多都加了synchronized,所以效率并不高,而HashMap的效率比Hashtable高。
3. 继承的类和实现的接口:Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。
4. 允许null值:Hashtable不允许key或value为null,而HashMap允许key或value为null。
5. 底层实现:Hashtable是通过拉链法实现的哈希表,而HashMap也是通过哈希表实现的,但是它使用的是链地址法。
相关问题
HashMap 和Hashtable 的区别
HashMap和Hashtable都是用于存储键值对的数据结构,主要区别有如下几点:
1. 线程安全:Hashtable是线程安全的,而HashMap是非线程安全的;
2. null值:HashMap可以存储null值作为key或value,而Hashtable则不允许任何null值;
3. 初始容量和加载因子:Hashtable的默认初始容量为11,加载因子为0.75;而HashMap的默认初始容量为16,加载因子也是0.75;
4. 遍历方式:由于Hashtable是早期的Java类,它的遍历方法是Enumeration;而HashMap由于继承了AbstractMap类,支持通过Iterator迭代器遍历;
5. 继承的父类不同:Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。
在java中如何区别HashMap和Hashtable、区别HashMap和LinkedHashMap、HashMap的底层实现(① new HashMap() ② put(key,value))
区别 HashMap 和 Hashtable:
1. 线程安全性:Hashtable 是线程安全的,HashMap 不是线程安全的。
2. Null 值:Hashtable 不允许 null 键和 null 值,而 HashMap 允许一个 null 键和多个 null 值。
3. 迭代器:Hashtable 的迭代器是 enumerator,而 HashMap 的迭代器是 Iterator。
4. 初始容量和扩容:Hashtable 的初始默认容量是 11,加载因子为 0.75,而 HashMap 的初始默认容量是 16,加载因子为 0.75。
区别 HashMap 和 LinkedHashMap:
1. 插入顺序和访问顺序:LinkedHashMap 在 HashMap 的基础上维护了一个双向链表,用来维护插入顺序或者访问顺序。可以根据插入顺序或者访问顺序来遍历 map。
2. 性能:LinkedHashMap 的插入、删除和定位性能略低于 HashMap,但是迭代访问时性能不受影响。
HashMap 的底层实现:
1. new HashMap() 会调用默认的构造函数,将初始容量设置为 16,负载因子设置为 0.75。
2. put(key, value) 方法先通过 key 的 hashCode() 方法计算出哈希值,然后通过哈希值和 HashMap 的长度计算出槽的索引位置,如果该位置没有元素,则直接插入到该位置。如果该位置已经有元素,则使用 equals() 方法判断 key 是否相等,相等则覆盖 value,否则以链表形式插入到该位置。如果链表长度超过了阈值(默认为 8),则将链表转化为红黑树,加速查找速度。当 HashMap 的元素数量超过了容量和负载因子的乘积时,会自动扩容、重新计算哈希值存储位置。
阅读全文