4

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

  • ssnNo- 社会安全号码
  • name.

一方面我有一个List对象Person(具有唯一的 ssnNo),另一方面我有一个Map包含 Person'sssnNo作为键和 Person'sname作为值。

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

问题 :

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

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

4

6 回答 6

3

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

当然,还有一些重要的性能考虑:

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

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

于 2013-07-07T16:28:07.343 回答
0

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

于 2013-07-07T16:21:35.780 回答
0

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

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

于 2013-07-07T16:24:31.170 回答
0

我认为拥有一个对象是有意义的,但使用 a over aPerson也是有意义的,因为查找时间会更快。我可能会使用with as和objects as :MapListMapSSNskeysPersonvalues

  Map<SSN,Person> ssnToPersonMap;
于 2013-07-07T16:24:48.623 回答
0

都是指针。Map<ssn,PersonName>实际上用 a而不是 a是没有意义的Map<ssn,Person>。大多数时候后者是最好的选择。

于 2013-07-07T16:25:07.123 回答
0

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

于 2013-07-07T16:25:17.747 回答