我看到Java的AtomicInteger如何在内部使用CAS(比较和交换)操作.基本上,当多个线程尝试更新值时,JVM在内部使用底层CAS机制并尝试更新该值.如果更新失败,则再次尝试使用新值但从不阻止.
在Java8中,Oracle引入了一个新的类LongAdder,它在高争用下似乎比AtomicInteger表现更好.一些博客文章声称LongAdder通过维护内部单元格表现更好 - 这是否意味着LongAdder在内部聚合值并在以后更新它?你能帮我理解LongAdder的工作原理吗?
我创建了一个哈希映射,用户输入密钥和值.如果输入特定键,我希望能够更改哈希映射的值.我尝试了setValue方法但什么都没得到.值和键都是字符串.我会用什么方法来改变它?
我有一个HashMap:
HashMap<string, Integer> hmap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
我想在哪里增加HashMap值.为了避免nullPointer Exception如果密钥不存在,我检查一下!假设数据是:
//201803271 - 1000
//201803271 - 1000
//201803272 - 1000
//inside a loop i read the data...
if (hmap.get("201803271") != null) {
hmap.put("201803271", hmap.get("201803271") + 1000);
}else{
hmap.put("201803271", 1000);
}
//end of loop
Run Code Online (Sandbox Code Playgroud)
这是有效的:
201803271 - 2000
201803272 - 1000
Run Code Online (Sandbox Code Playgroud)
但是,我读了这个问题如何在java hashmap中给出一个键来更新一个值?并且有一个使用Java 8方法的解决方案getOrDefault.我尝试过这个
hmap.put("201803271", count.getOrDefault("201803271", 1000) + 1000)
Run Code Online (Sandbox Code Playgroud)
但是,有了这个解决方案我得到错误的结果......
201803271 - 3000
201803272 - 2000
Run Code Online (Sandbox Code Playgroud)
我错过了什么?