在java中如何区别HashMap和Hashtable、区别HashMap和LinkedHashMap、HashMap的底层实现(① new HashMap() ② put(key,value))
时间: 2024-02-09 22:48:53 浏览: 85
区别 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 的元素数量超过了容量和负载因子的乘积时,会自动扩容、重新计算哈希值存储位置。
阅读全文