【问题标题】:memory allocation for hash map哈希映射的内存分配
【发布时间】:2013-05-12 12:34:06
【问题描述】:

我有 hashMap,键是“Document”,值是“DocumentSections”。Map <Document, DocumentSection>。 Document 有很多其他的成员变量(原始的和非原始的)。Document 也有一个唯一的 String 值。我的问题是,如果最好通过文档中的唯一字符串值替换文档作为键,例如HashMap<document.getValue(), DocumentSection>。其中 value 是一个唯一的字符串。如果我使用字符串作为键而不是更多的 Document 对象作为键,我的程序会消耗更少的内存吗?

谢谢

【问题讨论】:

    标签: java memory hashmap


    【解决方案1】:

    我的程序会消耗更少的内存

    不,地图仅存储对您的文档的引用。并且对 Document 或 String 的引用使用相同数量的内存。

    但是请注意,使用可变对象作为键通常是一个坏主意。因此,如果您的文档可以更改,从 hashcode/equals 的角度来看,您可能应该使用该 String。

    【讨论】:

    • 感谢您的回答。我已经用该文档的唯一字符串值覆盖了我的 equlas 和 hashmethode。因此,即使 Document 是可变的,该字符串值也始终是不变的。所以我确信使用 Document 对象作为键不会有问题。那正确吗?还是我错了?谢谢
    • 那么你可以使用任何一种方法——它们是等效的。
    • 如果你已经重写了 hashcode 和 equals ,如果遵守了协议,不用担心,假设你已经仔细完成了 equals 和 hashcode
    【解决方案2】:

    首先,document 作为键是错误的选择,因为它是一个可变对象。

    第二点是你不会通过用字符串替换 key 来节省内存,因为即使你不将它用作 key,文档对象也会保留在内存中。

    【讨论】:

    • 感谢您的回答。我已经用该文档的唯一字符串值覆盖了我的 equlas 和 hashmethode。因此,即使 Document 是可变的,该字符串值也始终是不变的。所以我确信使用 Document 对象作为键不会有问题。那正确吗?还是我错了?谢谢
    【解决方案3】:

    实际上,如果您使用字符串而不是文档作为键,哈希函数可能会花费更少的时间。

    【讨论】:

    • 嗨,格里普。谢谢。你说“可能需要更少的时间”。这是假设还是事实?
    • 考虑到Document的hashcode只调用String的hashcode,所以没有什么区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2011-02-07
    相关资源
    最近更新 更多