【问题标题】:Java - HashMap Memory : optimizationJava - HashMap 内存:优化
【发布时间】:2018-05-29 11:36:53
【问题描述】:

我想知道是否有更有效的方法来处理哈希映射。

我有以下 Map(主),它由其键和另一个 Map 作为值组成。

   final Map<String,Map<Boolean,String>> primaryMap = new HashMap<>();
     Map<Boolean,String> secondaryMap = new HashMap<>();

对于每个键,我分配了 2 个辅助映射,并再次初始化辅助映射。顺序类似于下面显示的顺序:

 secondaryMap = new HashMap<>();
       secondaryMap.put(true, "A");
       primaryMap.put("DOG", listedMap);

        secondaryMap.put(false, "B");
        primaryMap.put("DOG", listedMap);

 secondaryMap = new HashMap<>();

        secondaryMap.put(true, "C");
        primaryMap.put("CAT", listedMap);

        secondaryMap.put(false, "D");
        primaryMap.put("CAT", listedMap);

是否有更有效的方法来做到这一点? secondaryMap.clear()在调用secondaryMap = new HashMap&lt;&gt;();之前对内存有影响吗

非常感谢,

凯特

【问题讨论】:

  • listedMapsecondaryMap 应该是同一个东西吗?
  • 当然,你至少可以调用一次primaryMap.put("DOG",listedMap)(和"CAT"一样)
  • 每个内部地图最多可以有两个元素。你能简单地使用一对两个参考吗?如果您想区分丢失的键和映射到null 的键,可以向节点添加一对布尔值。
  • Map&lt;Boolean, String&gt; secondaryMap = primaryMap.computeIfAbsent("DOG", k -&gt; new HashMap&lt;&gt;()); 是在地图中使用地图的更好方式 - 如果您想要空间效率,您还可以使用字符串地图,例如map.put("DOG", "AB") 然后.getOrDefault("DOG", " ").charAt(boolValue ? 0 : 1)

标签: java memory hashmap


【解决方案1】:

只要内部Map 只能有两个键,您可以将其替换为自定义类:

final Map<String,Map<Boolean,String>> primaryMap = new HashMap<>();

可能是:

final Map<String, Foo> map = new HashMap<>();

你可以这样填充它:

 map.put("DOG", new Foo("A", "B"));

Foo 构造函数可能在哪里:

public Foo(String valueForTrue, Sting valueForFalse){
   this.valueForTrue = valueForTrue;
   this.valueForFalse = valueForFalse;
}

它会节省一些内存(因为需要更少的对象),但总的来说它会让你的代码更清晰。

当然,如果您可以仅为false 案例的true 添加String 值,您可以在Foo 中偏爱工厂而不是公共构造函数,例如:

private Foo(){
}

public static Foo ofTrue(String valueForTrue){
   Foo foo = new Foo();
   foo.valueForTrue = valueForTrue;
   return foo;
}

public static Foo ofFalse(String valueForFalse){
   Foo foo = new Foo();
   foo.valueForFalse = valueForFalse;
   return foo;
}

public static Foo of(String valueForTrue, Sting valueForFalse){
   Foo foo = new Foo();
   foo.valueForTrue = valueForTrue;
   foo.valueForFalse = valueForFalse;
   return foo;
}

【讨论】:

  • 谢谢,我想为了获得价值,它会以同样的方式工作:例如,map.get("CAT").get(true)
  • @Katherine99 不客气。您可以,但您也可以使用 map.get("CAT").getTrueValue(); 之类的内容跳过参数
  • 非常感谢这个提示!
  • @davidxxx 除非有证据证明这一点,否则我认为简单地说它会占用更少的空间实际上并不准确。可能是我在这里,但我实际上喜欢Map&lt;X, Map&lt;Y,Z&gt;&gt;,再次,可能是我很奇怪
  • @Eugene 这种方式没有 Map 对象,也没有布尔值。您如何希望它消耗与其他方式一样多? “可能是我很奇怪”。如果您喜欢容易出错的代码,那么您可能并不奇怪,而是特别 :)
【解决方案2】:

不确定这是您的代码还是只是复制/粘贴问题,但看起来您会更有效率:

 secondaryMap = new HashMap<>();
 secondaryMap.put(true, "A");
 secondaryMap.put(false, "B");
 primaryMap.put("DOG", secondaryMap);

new 之前的secondaryMap.clear() 也会清除您放入主地图的地图 - 它们是同一个对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2012-08-12
    • 2011-02-17
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    相关资源
    最近更新 更多