Java 自己的数据类型或哈希映射的集合
我必须将信息存储到数据结构中“Person”类型的对象。例如,信息可以是一个简单的整数值。整数值将频繁更改,存储信息的人员也可能更改。有两件事很重要:Java 自己的数据类型或哈希映射的集合,java,collections,hashmap,Java,Collections,Hashmap,我必须将信息存储到数据结构中“Person”类型的对象。例如,信息可以是一个简单的整数值。整数值将频繁更改,存储信息的人员也可能更改。有两件事很重要: 应该可以快速查找是否存储了特定人员的信息 我必须有大量这样的数据结构,所以内存很重要 我可以想出两种不同的方法。首先,我当然可以创建一个自己的数据类型,它既有对person的引用,也有作为字段的整数。问题:我想每次我想知道是否有某个特定的人的信息时,我都必须查看所有对象并调用该人的getter方法。其次,我可以使用一个HashMap,其中Pers
Patrick我不知道你为什么认为HashMap不如你所写的那么优雅(但我不知道你的编程技能有多惊人)。也许你的意思是HashMap有比你需要的更多的方法。HashMaps是为快速查找和内存效率而设计的(与优先排序的树状图相反)。关于内存效率,你检查过内存是如何增长的吗?与其他非散列映射相比,散列映射在项目数较少的情况下看起来像是内存猪,但与其他映射相比,内存使用量增长非常缓慢(开始时很小,但增长又大又快)。每个条目一个KB似乎有点大(这就是为什么我认为当你用足够的样本测量时,你会发现真实的大小要小得多),但是再一次,也许不是,一百万个条目意味着1MB——真的,这让你担心吗 一个1KB的人物对象对我来说似乎有点陡峭。您需要256个整型字段才能达到该大小 至于HashMap,我认为这是一个非常好的解决方案,尽管我会使用Person作为值,使用一些整数或字符串标识符作为键 快速查看源代码(不考虑映射对象本身的大小),每个映射条目对象都有一个int和3个引用,因此在32位VM上会有16个字节;如果Person对象中有20个int字段(80字节)和一个int as键,则Entry+Person+int键的总内存大约为100字节。 在这种情况下,对于拥有20个int字段的一百万人,您需要大约100Mb的内存(是否太多?) 至于信息本身,您可以做一些优化:
- 也许一个字节就足以满足一个人的年龄(遗憾的是,我们没有超过127岁:P)。考虑所需数据的值,以及一个字节或一个短字节是否足够
- 尽管情况并非总是如此(这取决于jvm实现),但大多数情况下布尔值是32位的,因此,如果您确实需要内存,并且有很多布尔字段,请使用单字节或短字段并对其进行位掩码。你可以得到一个字节的8个布尔值和一个字节的16个短值
但是,请注意,这些优化可能根本就不是必需的,它们肯定会影响代码的可读性。最后,最好的方法可能是运行一些测试并根据需要进行优化。person对象将占用1024字节?collections框架是为了简化编程,我认为在您决定它不适合您的需要之前,您应该首先开始使用
Map
实现<代码>地图插入和检索速度快,这可能是您需要的最重要的操作。我已经处理了超过2000万条记录的数据(包括关于人的数据和更多关于他们的信息),并将其保存在内存中——显然有更好的方法,但我使用了HashMap
。最常见的操作是什么?你说的“找人”是什么意思?按他的号码?按姓名每个人都有一个独特的领域吗?你不可能拥有全部,如果你想要低内存使用率,那么你必须在性能上做出一些妥协,反之亦然。否则HashMap default impl肯定不会为每个元素带来1kb的“开销”。好吧,我对HashMap有点谨慎,因为我曾经在person对象中使用了12个HashSet中的HashSet数组。内存使用率非常高,我可以通过使用我自己编写的一个简单集来减少内存使用量(我认为160000人的内存使用量增加了近400MB)。我猜HashMaps在内存使用方面可能类似于HashSet(或者至少它们不会消耗更少的内存)。可能小于1KB,但如果我大量使用它们,则不可忽略。