HashMap和Hashtable的区别?HashMap和HashSet区别?HashMap和TreeMap区别?
发表于|更新于|整理归纳
|总字数:699|阅读时长:2分钟|浏览量:
HashMap 和 Hashtable 的区别?HashMap 和 HashSet 区别?HashMap 和 TreeMap 区别?
HashMap 和 Hashtable 的区别
- 继承的父类不同
- HashMap继承自AbstractMap类。但二者都实现了Map接口
- Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。
- HashMap线程不安全,HashTable线程安全
- 包含的contains方法不同
- HashMap是没有contains方法的,而包括containsValue和containsKey方法;
- hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。
- 是否允许null值
- Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对
- HashTable键值对都不能为空,否则包空指针异常。
- 计算hash值方式不同
- 扩容方式不同(容量不够)
- 当容量不足时要进行resize方法,而resize的两个步骤
- 扩容
- rehash
- HashMap 哈希扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容结果,而且每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入;
- Hashtable扩容为原容量2倍加1;
- 当容量不足时要进行resize方法,而resize的两个步骤
- 解决hash冲突方式不同(地址冲突)
- Jdk1.8后,HashMap中,当出现冲突时可以(Jdk1.8之前这里不论述)
- 如果冲突数量小于8,则是以链表方式解决冲突。
- 当冲突大于等于8时,就会将冲突的Entry转换为红黑树进行存储。
- 而又当数量小于6时,则又转化为链表存储
- Jdk1.8后,HashMap中,当出现冲突时可以(Jdk1.8之前这里不论述)
HashMap 和 HashSet 的区别
区别-储存方式:
- HashSet实现了Set接口, 仅存储对象;
- HashMap实现了 Map接口, 存储的是键值对;
相同点-底层实现:
- HashSet底层其实是用HashMap实现存储的, HashSet封装了一系列HashMap的方法. 依靠HashMap来存储元素值,(利用hashMap的key键进行存储), 而value值默认为Object对象. 所以HashSet也不允许出现重复值, 判断标准和HashMap判断标准相同, 两个元素的hashCode相等并且通过equals()方法返回true.
HashMap 和 TreeMap 的区别
相同点:
- 继承了AbstractMap
不同点:
- 线程安全:
- HashMap非线程安全
- TreeMap非线程安全
- 调优选项:
- HashMap 基于哈希表实现,可以调优初始容量和负载因子
- 基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
- 应用场景:
- 适用于在Map中插入、删除和定位元素。
- 适用于按自然顺序或自定义顺序遍历键(key)。
- 速度效率:
- HashMap通常比TreeMap快一点(树和哈希表的数据结构使然)
- 是否有序
- HashMap 无序
- TreeMap 有序,默认按键值升序、可指定排序比较器实现自定义排序规则
文章作者: MUMU
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 blog.wo0ow.com!