何时使用 HashMap 而不是 LinkedList 或 ArrayList,反之亦然

2024-04-17

为什么我们不能总是使用 HashMap,尽管它在添加、删除操作上比 ArrayList 或 LinkedList 高效得多,而且与元素的数量无关。

我用 google 搜索了一下,发现了一些原因,但使用 HashMap 总有一种解决方法,而且优点仍然存在。


列表表示元素的顺序排列。 映射用于表示键/值对的集合。

虽然您可以使用地图作为列表,但这样做有一些明显的缺点。

维持秩序:

  • 根据定义,列表是有序的。您添加项目,然后可以按照插入项目的顺序迭代列表。当您向 HashMap 添加项目时,不能保证按照放入项目的顺序检索项目。 HashMap 的子类(如 LinkedHashMap)将维护顺序,但一般而言,Map 不能保证顺序。

键/值语义:

  • 映射的目的是基于可用于稍后检索该项目的键来存储项目。类似的功能只能在有限的情况下使用列表来实现,其中键恰好是列表中的位置。

代码可读性考虑以下示例。

    // Adding to a List
    list.add(myObject);         // adds to the end of the list
    map.put(myKey, myObject);   // sure, you can do this, but what is myKey?
    map.put("1", myObject);     // you could use the position as a key but why?

    // Iterating through the items
    for (Object o : myList)           // nice and easy
    for (Object o : myMap.values())   // more code and the order is not guaranteed

收藏功能通过 Collections 类,列表可以使用一些很棒的实用函数。例如 ...

    // Randomize the list
    Collections.shuffle(myList);

    // Sort the list
    Collections.sort(myList, myComparator);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 HashMap 而不是 LinkedList 或 ArrayList,反之亦然 的相关文章

  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 从文件中读取未知长度的int数组

    如何从文件中读取未知长度的整数数组 我没有找到获取数组大小的方法 所以我尝试了一些临时字符串的东西 但我的代码爆炸了 有更好的想法吗 Use std vector std ifstream inFile fileName std vecto
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数
  • 带 getClassLoader 和不带 getClassLoader 的 getResourceAsStream 有什么区别?

    我想知道以下两者之间的区别 MyClass class getClassLoader getResourceAsStream path to my properties and MyClass class getResourceAsStre
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大

随机推荐

  • 使用 DataInputStream 从文件读取非常慢

    我有一个包含大量数字的文件 我尝试使用以下代码从文件中读取它 但是速度非常慢 任何人都可以帮助减少时间吗 以下是我以非常慢的方式读取它的代码 import java io BufferedInputStream import java io
  • 异步绘图和触摸

    我有一个绘制区域 UIView 我在 CGContextRef 中绘制 当然 我正在捕捉触摸来画画 虽然 drawRect 方法缓慢绘制大量现有对象 但不会捕获触摸 如果我在单独的线程中或使用函数 dispatch async 在drawR
  • 尝试 glUseProgram 时出现 Opengl 错误 1281

    我有什么想法可以调试这个opengl进一步错误 1281 我正在从文件加载源代码 编译 链接 然后尝试检查错误glUseProgram 在我的对象的绘制方法中 log info gl2 glIsProgram shaderProgram t
  • imagesLoaded 方法不适用于 JQuery 砌体和无限滚动

    我一直在使用 JQuery masonry 现在我正在添加无限滚动 几乎每个砖石 砖块 中都有图像 在我使用无限滚动之前 图像加载得很好 一切都很棒 我为无限滚动添加了 javascript 的下一部分 并在内部添加了 imagesLoad
  • 使用 Visual Studio 2017 以 .NET Framework 2.0(不是 .NET Core 2.0)为目标

    我想为打开硬件监视器 https github com openhardwaremonitor openhardwaremonitor 它使用 NET Framework 2 0 同样 它不是 NET Core 2 0 当我克隆存储库并打开
  • 如何读取与 Rust 中的自定义类型关联的枚举值?

    我在 Rust 中有一个实现 如下所示 在主函数中 我正在读取一个值SalaryRange枚举 这将显示High So High This can be a complex type just using string for the qu
  • 如何将 tkinter 按钮垂直浮动在左侧

    我希望我的 tkinter 按钮 条目和文本垂直浮动在左侧的中间 我尝试过使用 pack 和 side left 但它只是水平堆叠它们 如果我可以垂直堆叠它们那就完美了 我尝试过使用网格 但无法将它们放在中间 我尝试过anchor w 但也
  • 如何设置特定Facebook页面的manage_pages权限?

    我如何将我的应用程序的管理页面权限仅设置为特定页面 现在我的应用程序获得了管理 Facebook 用户的所有页面的权限 我如何限制这一点并获得仅访问特定页面的权限 我正在使用一种简单的身份验证方法 app id xxxxxxxxxxxxx
  • Android Oreo (API26) 和 android.app.DownloadManager

    各位 此代码不适用于 Android Oreo 但在旧版本上可以 我可以看到通知和DownloadManager ACTION DOWNLOAD COMPLETE广播消息 Kotlin testButton setOnClickListen
  • OleDB INSERT 命令错误

    我有一个数据库 我使用 MS ACCESS 我有这个插入代码 我可以读取数据 但写入时出错 我按照说明操作 但它不起作用 这是我的代码 OleDbConnection con new OleDbConnection provider Mic
  • 设置 JOptionPane 对话框的助记符和热键

    是否可以为 JOptionPane 对话框中的按钮分配热键和助记符 我希望能够在 JOptionPane 生成的带有 是 否 和 取消 选项的消息对话框中 按 Y 键单击 是 按钮 按 N 键单击 否 按钮 然后按 escape 键激活转义
  • Kubernetes - 以编程方式找出服务 IP 范围 CIDR

    我需要一种方法来获取适用于所有 Kubernetes 集群的服务集群 IP 范围 如 CIDR 我尝试了以下方法 这对于使用 kubeadm 创建的集群效果很好 因为它会 grep apiserver pod 的参数 kubectl clu
  • 对数与平方根的 Big-O

    一般来说 以下内容总是正确的吗 log n O na a 1 s t a is any constant positive integer perhaps very large 如果不是的话 最大的值是多少a这个陈述对于哪些人来说是正确的
  • MySQL 加入不存在的地方

    我有一个连接两个表的 MySQL 查询 Voters 家庭 他们加入voters household id and household id 现在我需要做的是修改它 将选民表连接到第三个表 称为消除 voter id and elimina
  • 如何进行应用内购买去除广告

    我有 Android 游戏项目 我正在使用 ad mob 来投放广告 但是 如果有人想去掉广告就必须先付费怎么办 你能给我教程吗 因为我是 Android 和 Java 的新手 您只需在应用程序中创建一个按钮即可进行应用内购买 并且 一旦用
  • 使用 Gradle 运行命令行并保存输出结果

    我想使用 Gradle 运行命令行 该命令有一个输出 我在 Windows powershell 中运行此命令 mybat bat myArgs当我按回车键时 它会打印一些数字 如下所示 123456我想用 gradle 运行这个命令并保存
  • 在 SwiftUI 中创建自定义 Spacer() 时如何读取容器轴

    在 SwiftUI 中Spacer 文档 https developer apple com documentation swiftui spacer https developer apple com documentation swif
  • Sitecore - 如何导入内容?

    因此 我收到了一项新任务 将内容从网站导入到使用 Sitecore CMS 构建的新网站 我的客户基本上正在进行改造 以前的网站是使用非常旧的 CMS 构建的 所有内容都是 HTML 格式 我实际上正在考虑抓取旧网站并将所有内容转储为 cs
  • 在 Android Studio 上导入 panoramaGL

    我在项目中导入 PanoramaGL 库时遇到问题 这是图书馆https github com zarelaky panoramagl android tree master PanoramaGL https github com zare
  • 何时使用 HashMap 而不是 LinkedList 或 ArrayList,反之亦然

    为什么我们不能总是使用 HashMap 尽管它在添加 删除操作上比 ArrayList 或 LinkedList 高效得多 而且与元素的数量无关 我用 google 搜索了一下 发现了一些原因 但使用 HashMap 总有一种解决方法 而且