自己的数据类型或HashMap的集合



我必须将信息存储到数据结构中"Person"类型的对象中。例如,该信息可以是一个简单的整数值。整数值会频繁变化,存储信息的人员也会发生变化。有两件事很重要:

  1. 应该可以快速查找是否有针对特定人员的存储信息。
  2. 我将不得不拥有大量这样的数据结构,所以内存很重要。

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

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

Thanks and kind regards

帕特里克

1KB的person对象对我来说似乎有点陡峭。你需要256个int字段才能达到这个大小。

至于HashMap,我认为这是一个完美的解决方案,尽管我将使用Person作为值,并使用一些整数或字符串标识符作为键。

快速查看源代码(忽略map对象本身的大小),每个map Entry对象都有一个int和3个引用,因此在32位VM上这将是16字节;如果在Person对象中有20个int字段(80字节),并以int作为键,那么Entry + Person + int键的总内存将在100字节左右。在这些条件下,您将需要大约100Mb的100万人,其中有20个int字段(是不是太多了?)

对于信息本身,您可以做一些优化:

  • 也许一个字节就足够一个人的年龄了(遗憾的是,我们不能超过127岁:P)。考虑一下你需要的数据值,如果一个字节或一个短字节就足够了。
  • 如果你需要一个人的名字,而不是把它作为一个单一的字符串,考虑一个字符串[]与各种各样的名字,这样你可以利用字符串常量池和任何单一的名字重复自己将只在jvm中有一个实例。
  • 虽然情况并非总是如此(这取决于jvm的实现),但大多数情况下,布尔值是32位,所以如果你真的需要内存并且你有很多布尔字段,请使用单个字节或短字段和位掩码。你可以得到一个字节的8个"布尔值"和16个短值。
然而,请注意,也许这些优化甚至不是必需的,它们肯定会影响代码的可读性。最后,最好的方法可能是运行一些测试并在必要时进行优化。

我不知道为什么你认为HashMap不如你写的那么优雅(但我不知道你的编程技巧有多惊人)。也许你的意思是HashMap有比你需要的更多的方法。hashmap是为快速查找和内存效率而设计的(与优先排序的TreeMaps相反)。关于内存效率,你检查过内存是如何增长的吗?与其他非散列映射相比,hashmap可能看起来像内存猪,项目数量较少,但与其他map相比,内存使用增长非常缓慢(开始时很小,但增长很快)。每个条目的KB似乎有点大(这就是为什么我认为当您使用足够的样本进行测量时,您会发现真实大小要小得多),但话说回来,也许不是这样,一百万个条目意味着1mb——真的,这让您担心吗?

最新更新