ses*_*tus 15 java hashmap java-8 java-stream
我遇到了一个场景,我想要小写HashMap的所有键(不要问为什么,我只需要这样做).HashMap有数百万条目.
起初,我以为我只是创建一个新的Map,迭代要小写的地图条目,并添加相应的值.这个任务应该每天只运行一次或类似的东西,所以我想我可以裸露这个.
Map<String, Long> lowerCaseMap = new HashMap<>(myMap.size());
for (Map.Entry<String, Long> entry : myMap.entrySet()) {
lowerCaseMap.put(entry.getKey().toLowerCase(), entry.getValue());
}
Run Code Online (Sandbox Code Playgroud)
但是,当我的服务器在这一次过载时,我正要复制Map时,会导致一些OutOfMemory错误.
现在我的问题是,如何以最小的内存占用来完成这项任务?
在小写后删除每个键 - 添加到新Map帮助?
我可以利用java8流来加快速度吗?(例如这样的事情)
Map<String, Long> lowerCaseMap = myMap.entrySet().parallelStream().collect(Collectors.toMap(entry -> entry.getKey().toLowerCase(), Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)
更新
似乎它是一个Collections.unmodifiableMap所以我没有选择
在小写之后移除每个键 - 添加到新地图
Ken*_*ter 21
HashMap您可以尝试使用TreeMap不区分大小写的排序,而不是使用.这样可以避免创建每个密钥的小写版本:
Map<String, Long> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
map.putAll(myMap);
Run Code Online (Sandbox Code Playgroud)
一旦构造了这个映射,put()并且get()表现不区分大小写,那么您可以使用全小写键来保存和获取值.迭代键将以原始形式(可能是大写形式)返回它们.
以下是一些类似的问题: