首页 > 其他分享 >HashMap、LinkedHashMap和TreeMap:你真的了解它们吗?

HashMap、LinkedHashMap和TreeMap:你真的了解它们吗?

时间:2023-09-07 11:02:12浏览次数:41  
标签:HashMap TreeMap 插入 键值 null LinkedHashMap

HashMap、LinkedHashMap和TreeMap:你真的了解它们吗?_线程安全

亲爱的小伙伴们,大家好呀!我是小米,一个热衷于技术分享的90后程序员。今天我要和大家聊聊一个在面试中经常会被问到的话题:HashMap、LinkedHashMap、TreeMap的区别。这可是一个非常重要的知识点,不仅在面试中会被频繁提及,而且在实际开发中也经常用到。让我们一起深入了解这三者的异同吧!

HashMap

首先,我们从HashMap开始。HashMap是Java中的一个非常常用的数据结构,它实现了Map接口,允许我们将键和值关联在一起。HashMap的特点是快速、高效,它使用了哈希表来存储数据。

特点:

  • 无序性:HashMap中的键值对是无序存储的,不会按照任何顺序排列。
  • 允许null键和null值:HashMap允许键和值都为null。
  • 高效性能:HashMap的插入、删除、查找操作都非常高效,平均情况下时间复杂度为O(1)。
  • 不是线程安全的:HashMap不是线程安全的,如果在多线程环境下使用,需要额外的同步措施。

使用场景:

HashMap适用于大多数情况下,特别是当我们只关心键值对的存储和检索,而不关心它们的顺序时,HashMap是一个不错的选择。

LinkedHashMap

接下来,我们来看看LinkedHashMap。LinkedHashMap也是一个常用的Map实现,它继承自HashMap,并且保持了插入顺序。

特点:

  • 有序性:LinkedHashMap保持了键值对的插入顺序,所以遍历时会按照插入顺序输出。
  • 允许null键和null值:与HashMap一样,LinkedHashMap也允许键和值都为null。
  • 高效性能:LinkedHashMap的性能和HashMap类似,插入、删除、查找操作的平均时间复杂度为O(1)。
  • 不是线程安全的:LinkedHashMap也不是线程安全的,需要在多线程环境下进行同步处理。

使用场景:

当我们需要保持插入顺序时,可以选择使用LinkedHashMap。它常用于实现LRU缓存淘汰算法,因为可以通过LinkedHashMap的特性轻松实现。

TreeMap

最后,让我们看看TreeMap。TreeMap是基于红黑树的实现,它可以对键值对进行排序存储。

特点:

  • 有序性:TreeMap会对键进行排序存储,所以键值对是有序的。你可以根据键的自然顺序或者通过Comparator进行排序。
  • 不允许null键:TreeMap不允许键为null,如果插入null键会抛出NullPointerException。
  • 高效性能:TreeMap的插入、删除、查找操作的平均时间复杂度为O(log N),因为它基于红黑树实现。
  • 不是线程安全的:和前面两个Map实现一样,TreeMap也不是线程安全的。

使用场景:

当我们需要对键值对进行排序存储时,可以选择使用TreeMap。它常用于需要按照键的顺序遍历数据的场景。

总结

那么,HashMap、LinkedHashMap、TreeMap这三者到底有什么异同呢?

  • HashMap 是无序的,适用于大多数情况下的键值对存储和检索,性能高效。
  • LinkedHashMap 保持插入顺序,适用于需要保持顺序的场景,性能也很好。
  • TreeMap 有序存储,适用于需要排序的场景,性能相对较低,但在大数据集合中表现更出色。

在选择使用它们时,要根据具体的需求来进行合理的选择。如果你只关心键值对的存储和检索,并且不需要保持顺序,那么HashMap可能是最好的选择。如果你需要保持插入顺序或者对键进行排序,那么可以考虑使用LinkedHashMap或TreeMap

END

希望这篇文章能帮助你更好地理解HashMap、LinkedHashMap和TreeMap的区别,也能在面试中表现得更加从容和专业。如果你有任何问题或者想要了解更多关于Java的知识,欢迎留言交流,我会尽力解答你的疑问。另外,也欢迎大家关注我的公众号【知其然亦知其所以然】,一起学习技术,分享成长!

HashMap、LinkedHashMap和TreeMap:你真的了解它们吗?_线程安全_02

标签:HashMap,TreeMap,插入,键值,null,LinkedHashMap
From: https://blog.51cto.com/u_16237826/7395213

相关文章

  • HashMap的put方法
    HashMap结构简略图调用put()函数,如果table为空,则说明调用HashMap的无参构造函数并且第一次调用put函数,putVal内部调用resize()函数设置容量和阈值分别为16和12;(n-1)&hash进行取模计算下标,n是2的次幂,则n-1的有效位全为1,方便快速计算publicVput(Kkey,Vvalue){......
  • 文盘Rust -- 生命周期问题引发的 static hashmap 锁
    2021年上半年,撸了个rustcli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。春节后开始动手,在做的过程中会碰到各种有趣的问......
  • 文盘Rust -- 生命周期问题引发的 static hashmap 锁 | 京东云技术团队
    2021年上半年,撸了个rustcli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。春节后开始动手,在做的过程中会碰到各种有趣的问题......
  • HashMap遍历方式
    HashMap是一个键值对的集合,我们不能通过简单的循环来遍历HashMap,所以我们一般通过以下两种方式来遍历HashMap,一种是通过KeySet集合来遍历,另一种是通过entry键值对对象来遍历。KeySet遍历HashMap通过keySet()方法获取HashMap的keySet集合遍历keySet集合,可以使用iterator迭代器或......
  • HashMap线程安全(含答案)
    HashMap线程安全(含答案)Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的。看下面两个场景:1、当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不安全的问题了。2、当用在单例对象成员变量的时候呢?这时候多个线程过来访......
  • HashMap线程安全面试题(含答案)
    HashMap线程安全面试题(含答案)Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的。看下面两个场景:1、当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不安全的问题了。2、当用在单例对象成员变量的时候呢?这时候多个线......
  • ConcurrentHashMap是如何保证线程安全的
    ConcurrentHashMap是concurrent包下的一个集合类。它是线程安全的哈希表。它是通过“分段锁”来实现多线程下的安全问题。它将哈希表分成了不同的段内使用了可重入锁(ReentrantLock ),不同线程只在一个段内存在线程的竞争。它不会对整个哈希表加锁。|初始化数据结构时的线程安全Has......
  • 有序map linkedhashmap
    linkedHashMap中的元素会按照put()进去的顺序进行排序第一个put进去的元素就会放在第一位,以此类推原因是因为:linkedhashmap中维护的是数组与双向链表,第一个值会指向第二个值,第二个又指向第三个,所以就有序了linkedhashmap中有一个特点,可以删除不经常访问(get(key)方法)的元素,不经长......
  • hashmap与hashtable,arraylist与vector
    hashmap:key可以为null,key为null的话,就不会计算hashcode码,直接给了一个0,hashmap是2倍扩容原来的容量左移一位,线程不安全,计算下标不同,hashmap下标是高位与地位的‘&’运算hashtable:key以及value都不能为null,value为null会抛异常,hashcode值是根据key来计算的,而null没有hashcode......
  • HashMap 源码分析
    HashMap简介HashMap主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一,是非线程安全的。HashMap可以存储null的key和value,但null作为键只能有一个,null作为值可以有多个JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主......