【发布时间】:2011-12-09 08:26:39
【问题描述】:
我必须将信息存储到数据结构中“Person”类型的对象中。例如,该信息可以是一个简单的整数值。整数值会经常变化,存储信息的人也会发生变化。有两点很重要:
- 如果存储了特定人的信息,应该可以快速查找。
- 我必须拥有大量此类数据结构,因此内存很重要。
我能想到两种不同的方法。首先,我当然可以创建一个自己的数据类型,它既有对人的引用,也有整数作为字段。问题:我想每次我想知道是否有特定人的信息时,我都必须查看所有对象并为该人调用 getter 方法。其次,我可以使用以 Person 为键、以 Integer 为值的 HashMap。从面向对象的角度来看,这可能不如第一种可能性那么优雅。此外,更糟糕的是,HashMap 似乎比简单的集合消耗更多的内存(除此之外,我非常喜欢它们,似乎经常需要链接两个不同的对象)。如果每个都占用一个 KB,那么这对我来说已经是个问题了(我可能需要描述的数据结构大约一百万次)。
您会建议哪种变体?或者你能想到第三种更好的可能性吗?
感谢和亲切的问候
帕特里克
【问题讨论】:
-
一个人对象会占用1024字节?集合框架使编程更容易,我认为您应该首先开始使用
Map实现,然后再确定它不适合您的需求。Maps的插入和检索速度很快,这可能是您需要的最重要的操作。我已经处理了超过 2000 万条记录的数据(包括关于人的数据和更多关于他们的信息),并将它们全部保存在内存中 - 显然有更好的方法来做到这一点,但我使用了HashMap。 -
最频繁的操作是什么?你所说的“查找一个人”是什么意思?按他的号码?按名字?每个人都有一个独特的领域吗?
-
你不能拥有一切,如果你想要低内存使用率,那么你将不得不在性能上做出一些妥协,反之亦然。否则 HashMap 默认实现肯定没有每个元素 1kb 的“开销”。
-
嗯,我对 HashMap 有点小心,因为我曾经在一个 person 对象中使用 12 个 HashSet 中的一个 HashSet-Array。内存使用率非常高,我可以使用我自己编写的一个简单集合来减少它(我认为 160,000 人将近 400 MB)。我猜 HashMaps 在内存使用方面可能类似于 HashSets(或者至少它们不会消耗更少的内存)。也许不到 1KB,但如果我大量使用它们,也不能忽略。
标签: java collections hashmap