【问题标题】:Which Map/Collection to use?使用哪个地图/集合?
【发布时间】:2012-10-21 23:01:38
【问题描述】:

在下面的键/值列表中,“val3”针对不同的键重复。哪种地图最适合此类列表。

我希望“val3”只存储一次,多个键指向它。

key1---->val1
key2---->val3
key3---->val3
key5---->val5
key6---->val3
key7---->val6
key8---->val3
key9---->val3

【问题讨论】:

  • “仅存储一次”究竟是什么意思?
  • "val3" 不应在每个键的内存中重复
  • 完整的对象,还是只是参考?这就是我正在寻找的“完全”。我假设您了解引用和对象在 Java 中是如何工作的,并且地图只会包含 reference,而不是实际的对象?

标签: java collections hash


【解决方案1】:

任何Map 实现都可以。每个 Java 集合只包含引用,而不是实际对象,因此如果您将同一个对象多次放入映射中,所有值都将指向同一个对象。换句话说,通过key2 查找对val3 所做的更改将在通过指向val3 的任何其他键进行查找时反映出来。

考虑简化示例:

VeryLarge v = new VeryLarge();
Map<Integer, VeryLarge> map = new HashMap<>();
map.put(1, v);
map.put(2, v);
map.put(3, v);

单个VeryLarge 实例被所有123 键引用。

【讨论】:

【解决方案2】:

只要您确保不通过clone 操作获取值或值不是不可变 对象(除了String 文字或Integer.valueOf()(值来自-128到 127 是缓存并从缓存返回)这是异常),您最终会得到多个指向同一个相关引用的键。

所以你可以使用HashMap,例如@Tomasz Nurkiewicz 所建议的。

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2010-10-11
    • 2012-06-15
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多