Java 自己的数据类型或哈希映射的集合

Java 自己的数据类型或哈希映射的集合,java,collections,hashmap,Java,Collections,Hashmap,我必须将信息存储到数据结构中“Person”类型的对象。例如,信息可以是一个简单的整数值。整数值将频繁更改,存储信息的人员也可能更改。有两件事很重要: 应该可以快速查找是否存储了特定人员的信息 我必须有大量这样的数据结构,所以内存很重要 我可以想出两种不同的方法。首先,我当然可以创建一个自己的数据类型,它既有对person的引用,也有作为字段的整数。问题:我想每次我想知道是否有某个特定的人的信息时,我都必须查看所有对象并调用该人的getter方法。其次,我可以使用一个HashMap,其中Pers

我必须将信息存储到数据结构中“Person”类型的对象。例如,信息可以是一个简单的整数值。整数值将频繁更改,存储信息的人员也可能更改。有两件事很重要:

  • 应该可以快速查找是否存储了特定人员的信息
  • 我必须有大量这样的数据结构,所以内存很重要
  • 我可以想出两种不同的方法。首先,我当然可以创建一个自己的数据类型,它既有对person的引用,也有作为字段的整数。问题:我想每次我想知道是否有某个特定的人的信息时,我都必须查看所有对象并调用该人的getter方法。其次,我可以使用一个HashMap,其中Person作为键,Integer作为值。从面向对象的角度来看,这可能不像第一种可能那样优雅。此外,甚至更糟糕的是,哈希映射似乎比简单的集合消耗更多的内存(除此之外,我非常喜欢它们,它似乎经常需要链接两个不同的对象)。例如,如果每一个都使用一个KB,那么对我来说已经有问题了(我可能需要描述的数据结构大约一百万次)

    你建议哪种变体?或者你能想出第三种更好的可能性吗

    谢谢和亲切的问候


    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)。考虑所需数据的值,以及一个字节或一个短字节是否足够
    • 如果你需要一个人的名字,而不是把它保持为一个字符串,那么考虑一个具有不同名称的String [],这样你就可以利用字符串常量池,并且重复的任何单个名字在JVM中只有一个实例。
    • 尽管情况并非总是如此(这取决于jvm实现),但大多数情况下布尔值是32位的,因此,如果您确实需要内存,并且有很多布尔字段,请使用单字节或短字段并对其进行位掩码。你可以得到一个字节的8个布尔值和一个字节的16个短值

    但是,请注意,这些优化可能根本就不是必需的,它们肯定会影响代码的可读性。最后,最好的方法可能是运行一些测试并根据需要进行优化。

    person对象将占用1024字节?collections框架是为了简化编程,我认为在您决定它不适合您的需要之前,您应该首先开始使用
    Map
    实现<代码>地图插入和检索速度快,这可能是您需要的最重要的操作。我已经处理了超过2000万条记录的数据(包括关于人的数据和更多关于他们的信息),并将其保存在内存中——显然有更好的方法,但我使用了
    HashMap
    。最常见的操作是什么?你说的“找人”是什么意思?按他的号码?按姓名每个人都有一个独特的领域吗?你不可能拥有全部,如果你想要低内存使用率,那么你必须在性能上做出一些妥协,反之亦然。否则HashMap default impl肯定不会为每个元素带来1kb的“开销”。好吧,我对HashMap有点谨慎,因为我曾经在person对象中使用了12个HashSet中的HashSet数组。内存使用率非常高,我可以通过使用我自己编写的一个简单集来减少内存使用量(我认为160000人的内存使用量增加了近400MB)。我猜HashMaps在内存使用方面可能类似于HashSet(或者至少它们不会消耗更少的内存)。可能小于1KB,但如果我大量使用它们,则不可忽略。