【问题标题】:Map versus List地图与列表
【发布时间】:2013-07-07 16:17:19
【问题描述】:

输入:假设我有一个对象Person。它有两个属性,即

  • ssnNo - 社会安全号码
  • name

一方面我有一个ListPerson 对象(具有唯一的ssnNo),另一方面我有一个Map,其中包含Person 的ssnNo 作为键和Person 的name 作为值。

输出:我需要使用其 ssnNo 的人名。

问题:

  1. 我在上面提到的 2 种方法中应该遵循哪种方法,即使用列表或映射? (我认为显而易见的答案是地图)。

  2. 如果是地图,无论数据集大还是小,是否总是建议使用地图?我的意思是地图是否存在任何性能问题。

【问题讨论】:

  • 考虑到您收藏的大小作为约束,我认为 google guava-libraries 应该是一个不错的选择。

标签: java performance map


【解决方案1】:

地图是要走的路。地图的表现非常好,并且它们相对于查找列表的优势随着您的数据集变得更大而变得更大。

当然,还有一些重要的性能注意事项:

  1. 确保您具有良好的哈希码(和相应的等号)实现,以便您的数据将均匀分布在 Map 的存储桶中。

  2. 确保在分配地图时预先调整其大小(如果可能的话)。地图会自动调整大小,但调整大小操作本质上需要将每个先前的元素重新插入到新的更大的地图中。

【讨论】:

  • 感谢 Rob 的清晰解释。 (抱歉回复晚了..我出去了)
【解决方案2】:

你是对的,在这种情况下你应该使用地图。与列表相比,使用map没有性能问题,当数据很大时,性能明显优于列表。 Map 使用键的哈希码来检索条目,类似于数组使用索引来检索值的方式,这提供了良好的性能

【讨论】:

    【解决方案3】:

    这看起来适合Map<Long, Person> 将社会安全号码映射到相关Person 的情况。您可能需要考虑从 Person 中删除 ssnNo 字段以避免任何冗余(因为您会将这些值作为键存储在映射中)。

    一般来说,Maps 和Lists 是非常不同的结构,每个结构都适合不同的情况。每当您想要维护一组键值对时,您都可以使用前者,这样您就可以轻松快速(即在恒定时间内)根据键查找值(这就是您想要做的)。当您只想存储有序的线性元素集合时,可以使用后者。

    【讨论】:

      【解决方案4】:

      我认为拥有Person 对象是有意义的,但使用Map 而不是List 也是有意义的,因为查找时间会更快。我可能会使用MapSSNs 作为keysPerson 对象作为values

        Map<SSN,Person> ssnToPersonMap;
      

      【讨论】:

        【解决方案5】:

        都是指针。使用Map&lt;ssn,PersonName&gt; 而不是Map&lt;ssn,Person&gt; 实际上是没有意义的。大多数情况下后者是最佳选择。

        【讨论】:

        • 好吧,在某些情况下它可能是有意义的,例如,如果您知道您只需要通过 SSN 的名称。
        【解决方案6】:

        使用映射,尤其是使用哈希表实现的映射将比列表更快,因为这将允许您在恒定时间 O(1) 内获取名称。但是使用列表需要进行线性搜索,或者可能是较慢的二分搜索。

        【讨论】:

          猜你喜欢
          • 2014-01-12
          • 2010-11-17
          • 2016-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-31
          相关资源
          最近更新 更多