当前位置: 首页 > 知识库问答 >
问题:

我应该使用哪个Java集合?

张姚石
2023-03-14

在这个问题中,如何在C 11中有效地选择标准库容器?是选择C集合时使用的方便流程图。

我认为对于那些不确定应该使用哪个集合的人来说,这是一个有用的资源,所以我试图找到一个类似的Java流程图,但没能做到。

有哪些资源和“备忘单”可以帮助人们在用Java编程时选择正确的集合?人们如何知道他们应该使用什么列表、集合和映射实现?

共有3个答案

曾光誉
2023-03-14

这里有更简单的图片。有意简化!

>

  • 集合是任何包含称为“元素”(相同类型)的数据的东西。假设没有更具体的内容。

    List是一个索引数据集合,其中每个元素都有一个索引。类似于数组,但更灵活。

    列表中的数据保持插入顺序。

    典型操作:获取第n个元素。

    Set是一个元素包,每个元素只有一次(元素使用它们的equals()方法进行区分。

    数据集中的数据主要是为了知道有哪些数据。

    典型操作:告诉列表中是否存在元素。

    Map类似于List,但不是通过整数索引访问元素,而是通过它们的键(即任何对象)访问它们。就像PHP中的数组:)

    Map中的数据可通过其键搜索。

    典型操作:通过其ID获取元素(其中ID是任何类型的,而不仅仅是列表中的int)。

    >

    N、 B.标准库集确实是这样实现的:一个映射,其中键是集合元素本身,并且具有虚拟值。

    列表与映射:在列表中,您可以通过其索引(列表中的位置)访问元素,而在映射中,您可以通过其键访问任何类型的操作系统(通常为:ID)

    List与Set:在List中,元素受其位置的约束并且可以重复,而在Set中,元素只是“存在”(或不存在)并且是唯一的(在equals()compareTo()的含义中,用于SortedSet

  • 曾沛
    2023-03-14

    集合:一个接口,表示一个无序的项目“包”,称为“元素”。“下一个”元素未定义(随机)。

    • 集合:表示集合的接口,没有重复项。
      • 哈希集:由哈希表支持的集。当排序不重要时,使用最快和最小的内存
      • 链接哈希集:一种哈希集,添加了一个链表,以按插入顺序关联元素。“next”元素是下一个最近插入的元素
      • 树集:一个集合,其中元素由比较器排序(通常为自然排序)。最慢和最大的内存使用,但对于基于比较器的排序是必要的
      • 枚举集:为单个枚举类型定制的一种极其快速高效的枚举集
      • 数组列表:由数组支持的列表,其中数组的长度(称为“容量”)至少与元素的数量(列表的“大小”)相同。当大小超过容量时(当添加第1个元素时),将使用新容量(新长度*1.5)重新创建阵列--由于使用系统,因此这种重新创建速度很快。arrayCopy()。删除和插入/添加元素需要将所有相邻元素(右侧)移入或移出该空间。访问任何元素都很快,因为它只需要计算(元素零地址所需索引*元素大小)来找到它的位置。在大多数情况下,数组列表优于链接列表
      • 链接列表:由一组对象支持的列表,每个对象都链接到其“上一个”和“下一个”邻居。链接列表也是一个队列和Deque。从第一个或最后一个元素开始访问元素,然后遍历,直到达到所需的索引。插入和删除,一旦通过遍历达到所需的索引,只需重新映射直接相邻链接,以指向新元素或绕过现在删除的元素
      • 哈希映射:键无序的映射,由哈希表支持

      基本收藏图:

      将元素的插入与数组列表和链接列表进行比较:

    温开畅
    2023-03-14

    由于找不到类似的流程图,我决定自己制作一个。

    这个流程图并没有试图涵盖诸如同步访问、线程安全等或遗留集合,但它确实涵盖了3个标准集、3个标准映射和2个标准列表。

    此图像是为此答案创建的,并在知识共享署名4.0国际许可下获得许可。最简单的署名是链接到此问题或此答案。

    其他资源

    可能最有用的其他参考是oracle文档中描述每个集合的下一页。

    哈希集与树集

    这里详细讨论了何时使用HashSet或TreeSet:HashSet与TreeSet

    ArrayList与LinkedList

    详细讨论:何时使用LinkedList而不是ArrayList?

     类似资料:
    • 在这个问题中,如何在C 11中有效地选择标准库容器?是选择C集合时使用的方便流程图。 我认为对于那些不确定应该使用哪个集合的人来说,这是一个有用的资源,所以我试图找到一个类似的Java流程图,但没能做到。 有哪些资源和“备忘单”可以帮助人们在用Java编程时选择正确的集合?人们如何知道他们应该使用什么列表、集合和映射实现?

    • 问题内容: 由于我没有收到对最后一个问题的肯定回答。我将尝试自己编写一个Java FTP上传小程序。 我的问题是:“您能推荐一个Java FTP客户端库供我使用吗?” 我希望它是: 稳定 能够处理被动和主动模式 能够提供上传进度信息 如果出了问题(尤其是上传不成功时),则引发可捕获的异常 便宜/免费使用,最好是开源的 我发现这个 概述了一些库,但由于这篇文章是从2003年,也许一些新的事态发展已经

    • 问题内容: Java 8中有一整套日期类: ; ; ; ; ; 。 我已经忽略了他们的JavaDocs,并注意所有这些类都包含我需要的所有方法。因此,目前,我可以随机选择它们。但是我想为什么有6个单独的类并且每个类都专用于特定目的是有原因的。 技术信息和要求: 输入为,将转换为这些日期格式之一。 我不需要显示时区,但是当我比较两个日期时,能够正确比较纽约和巴黎的时间很重要。 精确的级别是秒,无需使

    • 问题内容: 的(Java持久性API)规范有2名不同的方式来指定实体组合键:和。 我在映射的实体上同时使用了这两个注释,但是对于不太熟悉的人来说,这真是一个大麻烦。 我只想采用一种指定复合键的方法。哪个真的是最好的?为什么? 问题答案: 我认为这可能更冗长,因为无法使用任何字段访问运算符来访问整个主键对象。使用,您可以这样做: 这给构成组合键的字段提供了清晰的概念,因为它们都聚集在通过字段访问运算

    • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我正在重写一个项目以使用Node.js。我想继续使用MySQL作为数据库(即使我不介意重写架构)。我正在寻找一种易于使用,性能合理的ORM,它支持缓存,多对一

    • 问题内容: 从JavaDocs: 一的ConcurrentLinkedQueue是当许多线程共享访问一个共同的集合一个合适的选择。此队列不允许空元素。 ArrayBlockingQueue是一个经典的“有界缓冲区”,其中固定大小的数组保存由生产者插入并由消费者提取的元素。此类支持可选的公平性策略,用于订购正在等待的生产者和使用者线程 与基于阵列的队列相比,LinkedBlockingQueue通常