Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-HashMap内存:优化_Java_Memory_Hashmap - Fatal编程技术网

Java-HashMap内存:优化

Java-HashMap内存:优化,java,memory,hashmap,Java,Memory,Hashmap,我想知道是否有更有效的方法来处理哈希映射 我有下面的Map(primary),它由它的键和另一个Map作为值组成 final Map<String,Map<Boolean,String>> primaryMap = new HashMap<>(); Map<Boolean,String> secondaryMap = new HashMap<>(); final Map primaryMap=new HashMap()

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

我有下面的Map(primary),它由它的键和另一个Map作为值组成

   final Map<String,Map<Boolean,String>> primaryMap = new HashMap<>();
     Map<Boolean,String> secondaryMap = new HashMap<>();
final Map primaryMap=new HashMap();
Map secondaryMap=新的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=newhashmap();
第二个map.put(true,“A”);
primaryMap.put(“狗”,listedMap);
二次映射put(false,“B”);
primaryMap.put(“狗”,listedMap);
secondaryMap=newhashmap();
二次映射put(true,“C”);
primaryMap.put(“CAT”,listedMap);
二次映射put(false,“D”);
primaryMap.put(“CAT”,listedMap);
是否有一种更有效的方法可以做到这一点? 调用
secondaryMap=newhashmap()之前,
secondaryMap.clear()对内存有影响吗

多谢各位


Kat

不确定这是您的代码还是只是复制/粘贴问题,但看起来您可以更高效地使用:

 secondaryMap = new HashMap<>();
 secondaryMap.put(true, "A");
 secondaryMap.put(false, "B");
 primaryMap.put("DOG", secondaryMap);
secondaryMap=newhashmap();
第二个map.put(true,“A”);
二次映射put(false,“B”);
主要地图。放置(“狗”,次要地图);

secondaryMap.clear()
在您的
new
之前,也将清除您放置在主映射中的映射-它们是同一对象

因为内部
映射只能有两个键,您可以用自定义类替换它:

final Map<String,Map<Boolean,String>> primaryMap = new HashMap<>();
其中
Foo
构造函数可以是:

final Map<String, Foo> map = new HashMap<>();
public Foo(String valueForTrue, Sting valueForFalse){
   this.valueForTrue = valueForTrue;
   this.valueForFalse = valueForFalse;
}
它将节省一些内存(因为需要的对象会少得多),但总体而言,它将使您的代码更加清晰。

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

 map.put("DOG", new Foo("A", "B"));
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;
}

listedMap
secondaryMap
应该是同一个东西吗?当然,您至少可以调用primaryMap.put(“DOG”,listedMap)一次(和“CAT”相同),每个内部映射最多可以有两个元素。你能简单地使用一对两个参考吗?如果要区分缺少的密钥和映射到
null
Map secondaryMap=primaryMap.computeIfAbsent(“DOG”,k->new HashMap())的密钥,可以向节点添加一对布尔值
是在地图中使用地图的一种更好的方式——如果你想节省空间,你也可以使用字符串地图,例如,
map.put(“DOG”,“AB”)
,然后
.getOrDefault(“DOG”,“DOG”).charAt(布尔值?0:1)
谢谢,我想为了获得值,它的工作方式是相同的:例如,map.get(“CAT”).get(true)@凯瑟琳99不客气。可以,但也可以使用类似于
map.get(“CAT”).getTrueValue()的内容跳过参数非常感谢您的提示@davidxxx除非有证据证明这一点,否则我不认为简单地说它占用更少的空间实际上是准确的。这里可能是我,但我真的很喜欢
地图
,同样,可能是我weird@Eugene这种方式没有贴图对象,也没有布尔值。您希望它如何像其他方式一样消耗那么多?“可能是我太怪异了”。如果您喜欢容易出错的代码,您可能并不奇怪,但很特别:)