【发布时间】:2020-05-29 14:17:47
【问题描述】:
执行以下代码:
public class Main {
public static void main(String[] args) {
Util util = new Util();
util.addBlock(1);
util.addBlocks(util.getBlocks());
}
}
public class Util {
public static HashMap<Long, Integer> blockMap = new HashMap<>();
private Gson gson = new Gson();
public void addBlocks(String json){
Map map = gson.fromJson(json, Map.class);
blockMap.putAll(map);
System.out.println(blockMap.keySet());
}
public void addBlock(int i){
blockMap.put(0L, i);
}
public String getBlocks(){
return gson.toJson(blockMap);
}
}
我得到了输出
[0, 0]
来自打印System.out.println(blockMap.keySet());。
因此,出于某种原因,我有一个 Map<Long, Integer>,其中包含两个 Longs,其值为 0 作为键。还有一个键集Set<Long> 和两个0s。但是map和set不允许重复key,这怎么可能?
代码首先在地图中添加了一个简单的入口:
blockMap.put(0L, i);
然后,我通过使用 GSON 将地图转换为 JSON 字符串,然后再返回地图来添加另一个条目:
gson.toJson(blockMap);
...
Map map = gson.fromJson(json, Map.class);
blockMap.putAll(map);
我希望它会覆盖上一个条目,而不是添加具有相同重复键的另一个条目。
【问题讨论】:
-
你能发一个minimal reproducible example吗?
-
我不同意。我刚刚尝试了提供的代码,这会打印出操作员所说的内容。
-
@Schottky OPs 代码不完整,您如何按原样执行它?
Block和 JSON 有效负载丢失。请分享完整代码,其他人也可以复制和调查。 -
@Zabuza 这就是问题所在。使用这个实现,一个键是 String,另一个键是 Long
-
你基本上绕过了通用系统。所以有了这个,你基本上可以在你的地图中插入你想要的任何东西,而不仅仅是
Long。该地图的工作原理仍然相同,但不允许重复。但是通过能够插入任何你想要的东西,你可以轻松地插入看起来相似但实际上不同的东西,比如字符串"0"vs 长0vs 整数0vs 短0,.. . 一切都会被认为是不同的。