JAVA中HashMap、TreeMap、LinkedHashMap 的用法与注意事项

在 Java 中,Map 是一种用于存储键值对(Key-Value)的集合,它不允许键重复,允许值重复。HashMapTreeMapLinkedHashMapMap 接口的常见实现类,它们各自有不同的特点和适用场景。理解它们的异同,不仅能帮助我们更好地选择合适的实现,也能在实际开发中提高代码的效率和可维护性。

一、HashMap - 高效的无序存储

HashMap 是最常用的 Map 实现类,它基于哈希表实现,允许 null 键和 null 值。其内部使用哈希算法对键进行哈希运算,确保键的查找和插入具有常数时间复杂度 O(1)。

适用场景
  • 需要高效查找的场景HashMap 在查找、插入和删除时的时间复杂度都是 O(1),非常适合那些需要频繁查询和更新的场景。
  • 无序存储的需求HashMap 不保证存储元素的顺序。如果你不关心元素的顺序,可以选择 HashMap
注意事项
  • 无序性HashMap 不保证键值对的顺序,插入的顺序和遍历的顺序是不同的。
  • 线程不安全HashMap 在多线程环境下不安全,若多个线程并发修改同一个 HashMap,可能会导致数据不一致问题。
  • 空键与空值HashMap 允许一个 null 键和多个 null 值。
二、TreeMap - 有序的键值对存储

TreeMap 是基于红黑树实现的 Map,它保证了键值对按照键的自然顺序(或者根据构造时提供的比较器)进行排序。TreeMap 不允许 null 键,但允许多个 null 值。

适用场景
  • 需要按键排序的场景:如果你需要一个有序的 MapTreeMap 是一个理想选择。它会根据键的自然顺序或自定义顺序进行排序。
  • 需要范围查询的场景TreeMap 支持高效的范围查询,比如你可以使用 subMap() 方法快速获取键范围内的元素。
注意事项
  • 性能问题TreeMap 的基本操作(如插入、删除、查找)的时间复杂度为 O(log n),相比 HashMap 的 O(1) 查找,性能稍逊。
  • 不允许 null:由于 TreeMap 依赖于键的比较,所以 null 键是不被允许的。
三、LinkedHashMap - 保持插入顺序的 Map

LinkedHashMapHashMap 的一个子类,内部采用双向链表维护元素的插入顺序(或者最后访问顺序)。它与 HashMap 在性能上相似,但它能保持元素插入的顺序,或者在访问顺序上进行排序。

适用场景
  • 需要保持插入顺序的场景:如果你需要一个能够保持插入顺序的 Map,比如缓存实现,LinkedHashMap 是一个不错的选择。
  • 最近最少使用(LRU)缓存实现LinkedHashMap 可以通过构造方法的 accessOrder 参数,支持按访问顺序排序,从而轻松实现 LRU 缓存。
注意事项
  • 性能开销LinkedHashMap 相较于 HashMap,由于多了一条链表用于维护顺序,其性能稍逊。对于大规模数据,性能差异可能会有所体现。
  • 插入顺序与访问顺序:通过构造方法,你可以指定 LinkedHashMap 按插入顺序或访问顺序排序,访问顺序的排序方式常用于缓存淘汰算法。
四、总结:如何选择合适的 Map
特性HashMapTreeMapLinkedHashMap
顺序保证无序按键自然顺序或自定义顺序保持插入顺序或访问顺序
性能O(1)(查找/插入/删除)O(log n)(查找/插入/删除)接近 O(1)(查找/插入/删除)
允许 null 键/值允许一个 null 键和多个 null不允许 null允许一个 null 键和多个 null
线程安全不安全不安全不安全
适用场景高效查询,无需顺序有序数据,范围查询保持插入顺序或访问顺序
五、实际代码示例
import java.util.*;public class MapExample {public static void main(String[] args) {// HashMap 示例Map<String, Integer> hashMap = new HashMap<>();hashMap.put("Apple", 2);hashMap.put("Banana", 3);System.out.println("HashMap: " + hashMap);// TreeMap 示例Map<String, Integer> treeMap = new TreeMap<>();treeMap.put("Apple", 2);treeMap.put("Banana", 3);System.out.println("TreeMap: " + treeMap);// LinkedHashMap 示例Map<String, Integer> linkedHashMap = new LinkedHashMap<>();linkedHashMap.put("Apple", 2);linkedHashMap.put("Banana", 3);linkedHashMap.put("Orange", 1);System.out.println("LinkedHashMap: " + linkedHashMap);// LRU 缓存示例 (访问顺序)Map<String, Integer> lruCache = new LinkedHashMap<>(16, 0.75f, true);lruCache.put("Apple", 1);lruCache.put("Banana", 2);lruCache.put("Orange", 3);lruCache.get("Apple"); // 访问 "Apple"System.out.println("LRU Cache: " + lruCache);}
}
六、结语

Java 中的 HashMapTreeMapLinkedHashMap 各有其独特的特性和应用场景。在日常开发中,选择合适的 Map 实现类不仅能提高程序性能,还能更好地满足业务需求。希望这篇文章能帮助你在不同场景下做出最佳选择,让你的代码更高效、更清晰。如果你对这些 Map 实现类有更多的疑问,欢迎在评论区讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483620.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevOps工程技术价值流:GitLab源码管理与提交流水线实践

在当今快速迭代的软件开发环境中&#xff0c;DevOps&#xff08;开发运维一体化&#xff09;已经成为提升软件交付效率和质量的关键。而GitLab&#xff0c;作为一个全面的开源DevOps平台&#xff0c;不仅提供了强大的版本控制功能&#xff0c;还集成了持续集成/持续交付(CI/CD)…

Android笔记【12】脚手架Scaffold和导航Navigation

一、前言 学习课程时&#xff0c;对于自己不懂的点的记录。 对于cy老师第二节课总结。 二、内容 1、PPT介绍scaffold 2、开始代码实操 先新建一个screen包&#xff0c;写一个Homescreen函数&#xff0c;包括四个页面。 再新建一个compenent包&#xff0c;写一个displayText…

动态规划-----路径问题

动态规划-----路径问题 下降最小路径和1&#xff1a;状态表示2&#xff1a;状态转移方程3 初始化4 填表顺序5 返回值6 代码实现 总结&#xff1a; 下降最小路径和 1&#xff1a;状态表示 假设&#xff1a;用dp[i][j]表示&#xff1a;到达[i,j]的最小路径 2&#xff1a;状态转…

C_字符串的一些函数

1.字符串输入函数 scanf("%s",数组名)&#xff1b; gets(数组名)&#xff1b; 区别&#xff1a; scanf(“%s”,数组名); 把空格识别为输入结束 #include <stdio.h>int main() {char a[10];printf("输入&#xff1a;");scanf("%s",a)…

【数据事务】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

Zookeeper集群数据是如何同步的?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper集群数据是如何同步的?】面试题。希望对大家有帮助&#xff1b; Zookeeper集群数据是如何同步的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper集群中的数据同步是通过一种称为ZAB&#xff08;Zo…

MySQL需掌握到何种程度?才能胜任工作

大家好&#xff0c;我是袁庭新。星友问&#xff1a;MySQL需要学到什么程度&#xff1f;才能胜任日常的软件开发工作呢&#xff01;以下是一些建议的学习目标和程度&#xff0c;这些目标旨在帮助你在工作中高效地使用MySQL。 数据库的基本概念、MySQL的安装及配置、SQL的概念、S…

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…

Qt 2D绘图之三:绘制文字、路径、图像、复合模式

参考文章链接: Qt 2D绘图之三:绘制文字、路径、图像、复合模式 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象…

java调用ai模型:使用国产通义千问完成基于知识库的问答

整体介绍&#xff1a; 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档&#xff08;例如Word格式文件&#xff09;导入系统&#xff0c;通过数据清洗、向量化处理…

Java 基于Spring AI RAG组件做AI智能问答_rag检索增强_AI智能问答

基于RAG技术构建高效Java智能问答客服机器人 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以构建高效的Java智能问答客服机器人。首先&#xff0c;通过向量化处理将Word格式的问答QA文档转换为机器可理解的形式&#xff0c;并存储于Vect…

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09; 目录 顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战&#xff0c;文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能&#xff0c;但是可能会出现缓存一致性问题。如果数据频繁的变更&#xff0c;可能会导…

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

6.824/6.5840(2024)环境配置wsl2+vscode

本文是经过笔者实践得出的最速の环境配置 首先&#xff0c;安装wsl2和vscode 具体步骤参见Mit6.s081环境配置踩坑之旅WSL2VScode_mit6s081-CSDN博客 接下来开始为Ubuntu(笔者使用的版本依然是20.04)配置go的相关环境 1、更新Ubuntu的软件包 sudo apt-get install build-es…

【排序用法】.NET开源 ORM 框架 SqlSugar 系列

&#x1f4a5; .NET开源 ORM 框架 SqlSugar 系列 &#x1f389;&#x1f389;&#x1f389; 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…

「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版

本篇将带你实现一个升级版的数字猜谜游戏。相比基础版&#xff0c;新增了计分和历史记录功能&#xff0c;用户可以在每次猜测后查看自己的得分和猜测历史。此功能展示了状态管理的进阶用法以及如何保存和显示历史数据。 关键词 UI互动应用数字猜谜状态管理历史记录用户交互 一…

040集——CAD中放烟花(CAD—C#二次开发入门)

效果如下&#xff1a; 单一颜色的烟花&#xff1a; 渐变色的火花&#xff1a; namespace AcTools {public class HH{public static TransientManager tm TransientManager.CurrentTransientManager;public static Random rand new Random();public static Vector3D G new V…

【机器学习】分类任务: 二分类与多分类

二分类与多分类&#xff1a;概念与区别 二分类和多分类是分类任务的两种类型&#xff0c;区分的核心在于目标变量&#xff08;label&#xff09;的类别数&#xff1a; 二分类&#xff1a;目标变量 y 只有两个类别&#xff0c;通常记为 y∈{0,1} 或 y∈{−1,1}。 示例&#xff…

Python实现网站资源批量下载【可转成exe程序运行】

Python实现网站资源批量下载【可转成exe程序运行】 背景介绍解决方案转为exe可执行程序简单点说详细了解下 声明 背景介绍 发现 宣讲家网 的PPT很好&#xff0c;作为学习资料使用很有价值&#xff0c;所以想下载网站的PPT课件到本地&#xff0c;但是由于网站限制&#xff0c;一…