• Java集合大总结——Map集合


    1、Map集合框架

    注意:Map接口是在java.util.Map 的包下,Map 接口不是 Collection 的子接口,它是使用键、值映射表来存储【Map 不能有重复的键(覆盖),每个键可以映射到最多一个值】。
    Map 接口的实现类较多,在此我们关注 HashMap 、 TreeMap 、 HashTable 、 LinkedHashMap

    1.1 关于Map接口中的主要实现类

    1. 继承结构图如下所示
      在这里插入图片描述
    2. Map接口实现类的代码:
    • HashMap类:
    public class HashMap<K,V> extends AbstractMap<K,V>
       implements Map<K,V>, Cloneable, Serializable 
    
    • 1
    • 2
    • TreeMap类:
    public class TreeMap<K,V>
        extends AbstractMap<K,V>
        implements NavigableMap<K,V>, Cloneable, java.io.Serializable
    
    • 1
    • 2
    • 3
    • LinkedHashMap类:
    public class LinkedHashMap<K,V>
        extends HashMap<K,V>
        implements Map<K,V>
    
    • 1
    • 2
    • 3
    • Hashtable类:
    public class Hashtable<K,V>
        extends Dictionary<K,V>
        implements Map<K,V>, Cloneable, java.io.Serializable
    
    • 1
    • 2
    • 3

    1.2 各实现类的特点:

    • HashMap
    • TreeMap
      • 继承 AbstractMap ,底层数据结构是一个红黑树基于 NavigableMap 实现
      • 非线程安全的
      • key 不能存 null ,但是 value 可以存 null
      • key 必须是可比较的 (即要么实现 Comparable 接口,要么传递一个 Comparator 比较器)
    • Hashtable
      • 该类实现了一个哈希表,它将键映射到值
      • 不允许 null 作为键和值
      • 默认初始容量(initialCapacity)为 11 ,默认负载因子( loadFactor )为 0.75f
      • 同步的(线程安全的)
      • 不保证顺序
      • 扩容方式是旧容量的2倍 +1
      • 数组 + 链表方式存储
      • 添加值时
        • 如果 hash 一样 equals 为 false 则将当前值添加到链表头
        • 如果 hash 一样 equals 为 true 则使用当前值替换原来的值 ( key 相同)。
    • LinkedHashMap
      • 哈希表和双向链表实现的 Map 接口
      • 具有可预测的迭代次序(有序)
      • 非线程安全
      • 允许空元素

    2. HashMap 和 Hashtable 的区别

    • 线程是否安全: HashMap 是非线程安全的, Hashtable 是线程安全的,因为Hashtable 内部的方法基本都经过synchronized修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!,Hashtable已经过时了);
    • 效率: 因为线程安全的问题, HashMap 要比 Hashtable 效率高一点。
    • Null key Null value 的支持: HashMap 可以存储 nullkeyvalue,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有null键和null值,否则会抛出 NullPointerException 。
    • 初始容量大小和每次扩充容量大小的不同:
      • 创建时如果不指定容量初始值, Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1
      • HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍
      • 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小
    • 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间。 Hashtable 没有这样的机制。

    3. HashMap 和 HashSet 区别

    • HashSet 底层就是基于 HashMap 实现的。
    • 实现接口不同
      • HashMap 实现Map接口
      • HashSet 实现Set接口
    • 存储不同
      • HashMap 存储键值对
      • HashSet 存储对象
    • 添加方式不同
      • HashMap 调用put()添加元素
      • HashSet 调用add()添加元素
    • 计算HashCode不同
      • HashMap 使用键(Key)计算 hashcode
      • HashSet 使用成员对象来计算hashcode值,对于两个不同的对象来说hashcode 可能相同,所以还要用 equals() 方法用来判断对象的相等性.

    4. HashMap 和 TreeMap 区别

    1. TreeMap 和 HashMap 都继承自 AbstractMap ,但是需要注意的是 TreeMap 它还实现了 NavigableMap 接口和 SortedMap 接口。
    2. 实现NavigableMap接口让 TreeMap 有了对集合内元素的搜索的能力。
    3. 实现SortedMap接口让 TreeMap 有了对集合中的元素根据键排序的能力。

    综上,相比于HashMap来说 TreeMap 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。

  • 相关阅读:
    去中心化金融 Defi 之稳定币、借贷与聚合器
    Spring Boot 3.0.x和Oracle Database 23c Database API for MongoDB的示例
    Unity 导航寻路快速上手
    【Redis数据库百万字详解】数据类型
    C陷阱与缺陷 第8章 建议与答案 8.2 答案
    【数据结构】图 常见题型汇总
    flutter3-macOS桌面端os系统|flutter3.x+window_manager仿mac桌面管理
    C# Winform编程(4)多文档窗口(MDI)
    SSO单点登录流程详解
    浏览器必备的管理工具,蓝色书签让你更方便
  • 原文地址:https://blog.csdn.net/Best_Basic/article/details/132790614