HashMap 和 Hashtable 的区别?HashMap 和 HashSet 区别?HashMap 和 TreeMap 区别?

HashMap 和 Hashtable 的区别

HashMap和Hashtable的区别

  1. 继承的父类不同
    1. HashMap继承自AbstractMap类。但二者都实现了Map接口
    2. Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。
  2. HashMap线程不安全,HashTable线程安全
  3. 包含的contains方法不同
    1. HashMap是没有contains方法的,而包括containsValue和containsKey方法;
    2. hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。
  4. 是否允许null值
    1. Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对
    2. HashTable键值对都不能为空,否则包空指针异常。
  5. 计算hash值方式不同
  6. 扩容方式不同(容量不够)
    1. 当容量不足时要进行resize方法,而resize的两个步骤
      1. 扩容
      2. rehash
        1. HashMap 哈希扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容结果,而且每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入;
        2. Hashtable扩容为原容量2倍加1;
  7. 解决hash冲突方式不同(地址冲突)
    1. Jdk1.8后,HashMap中,当出现冲突时可以(Jdk1.8之前这里不论述)
      1. 如果冲突数量小于8,则是以链表方式解决冲突。
      2. 当冲突大于等于8时,就会将冲突的Entry转换为红黑树进行存储。
      3. 而又当数量小于6时,则又转化为链表存储

HashMap 和 HashSet 的区别

HashSet与HashMap的区别

区别-储存方式:

  • HashSet实现了Set接口, 仅存储对象;
  • HashMap实现了 Map接口, 存储的是键值对;

相同点-底层实现:

  • HashSet底层其实是用HashMap实现存储的, HashSet封装了一系列HashMap的方法. 依靠HashMap来存储元素值,(利用hashMap的key键进行存储), 而value值默认为Object对象. 所以HashSet也不允许出现重复值, 判断标准和HashMap判断标准相同, 两个元素的hashCode相等并且通过equals()方法返回true.

HashMap 和 TreeMap 的区别

HashMap与TreeMap的区别

相同点:

  • 继承了AbstractMap

不同点:

  • 线程安全:
    • HashMap非线程安全
    • TreeMap非线程安全
  • 调优选项:
    • HashMap 基于哈希表实现,可以调优初始容量和负载因子
    • 基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
  • 应用场景:
    • 适用于在Map中插入、删除和定位元素。
    • 适用于按自然顺序或自定义顺序遍历键(key)。
  • 速度效率:
    • HashMap通常比TreeMap快一点(树和哈希表的数据结构使然)
  • 是否有序
    • HashMap 无序
    • TreeMap 有序,默认按键值升序、可指定排序比较器实现自定义排序规则