输入:假设我有一个Person
对象。它有2个属性,即
ssnNo
- 社会安全号码name
。 一方面,我有List
个Person
个对象(具有唯一的ssnNo),另一方面我有Map
个人ssnNo
作为关键字,人的name
为值。
输出:我需要使用ssnNo的人名。
问题:
在上面提到的2中使用哪种方法,即使用列表或地图? (我认为显而易见的答案就是地图)。
如果是地图,是否始终建议使用地图,无论数据集是大还是小?我的意思是地图上有任何性能问题。
答案 0 :(得分:3)
地图是要走的路。地图执行得非常好,与查找列表相比,它们的优势越大,数据集越大。
当然,有一些重要的性能考虑因素:
确保您有一个好的哈希码(以及相应的等于)实现,这样您的数据将均匀地分布在地图的桶中。
确保在分配地图时预先调整地图大小(如果可能的话)。地图将自动调整大小,但调整大小操作基本上需要将每个先前元素重新插入到更大的新地图中。
答案 1 :(得分:0)
你是对的,在这种情况下你应该使用地图。使用map与列表相比没有性能问题,当数据很大时,性能明显优于列表。 Map使用键的哈希码来检索条目,类似于数组使用索引检索值,这样可以提供良好的性能
答案 2 :(得分:0)
这似乎适用于将社会安全号码映射到相关Map<Long, Person>
的{{1}}。您可能需要考虑从Person
中删除ssnNo
字段,以避免任何冗余(因为您将这些值存储为地图中的键)。
通常,Person
和Map
是非常不同的结构,每种结构都适合不同的情况。只要您想维护一组键值对,就可以使用前者,这样您可以轻松快速地(即在恒定时间内)根据键查找值(这是您想要做的)。当您只想存储有序的线性元素集合时,可以使用后者。
答案 3 :(得分:0)
我认为拥有Person
对象是有道理的,但是对Map
使用List
也是有意义的,因为查找时间会更快。我可能会使用Map
SSNs
作为keys
和Person
个对象作为values
:
Map<SSN,Person> ssnToPersonMap;
答案 4 :(得分:0)
这都是指针。拥有Map<ssn,PersonName>
而不是Map<ssn,Person>
实际上没有任何意义。后者是大多数时候的最佳选择。
答案 5 :(得分:0)
使用map尤其是使用哈希表实现的地图将比列表更快,因为这将允许您以恒定时间O(1)获取名称。但是,使用列表需要进行线性搜索,或者可能是速度较慢的二进制搜索。