【问题标题】:Collection of an own datatype or HashMap自己的数据类型或 HashMap 的集合
【发布时间】:2011-12-09 08:26:39
【问题描述】:

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

  1. 如果存储了特定人的信息,应该可以快速查找。
  2. 我必须拥有大量此类数据结构,因此内存很重要。

我能想到两种不同的方法。首先,我当然可以创建一个自己的数据类型,它既有对人的引用,也有整数作为字段。问题:我想每次我想知道是否有特定人的信息时,我都必须查看所有对象并为该人调用 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


【解决方案1】:

一个 1KB 的人对象对我来说似乎有点陡峭。您需要大约 256 个 int 字段才能达到该大小。

至于 HashMap,我认为它是一个非常好的解决方案,虽然我会使用 Person 作为值并使用一些整数或字符串标识符作为键。

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

至于信息本身,你可以做一些优化:

  • 也许一个字节足以满足一个人的年龄(遗憾的是,我们并没有超过 127 岁:P)。考虑一下您需要的数据值,以及一个字节或一个短字节是否足够。
  • 如果您需要一个人的姓名,而不是将其保留为单个字符串,请考虑使用具有各种名称的 String[],这样您就可以利用字符串常量池和任何重复的单个名称jvm 中只有一个实例。
  • 虽然情况并非总是如此(这取决于 jvm 实现),但大多数情况下,布尔值是 32 位的,所以如果您确实需要内存并且有很多布尔字段,请使用单个字节或短字段和位掩码。您可以获得 8 个“布尔”字节和 16 个短字节。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多