大佬教程收集整理的这篇文章主要介绍了用Java增加Map值的最有效方法,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
对于这个问题,我已经得到了很多不错的答案-谢谢大家-所以我决定进行一些测试,找出哪种方法实际上最快。我测试的五种方法是:
方法
这是我做的…
结果 我将首先介绍结果,并为感兴趣的人提供以下代码。
如所预期的,ContainsKey方法是最慢的,因此,与该方法的速度相比,我将给出每种方法的速度。
结论
似乎只有MutableInt方法和Trove方法要快得多,因为它们的性能提升只有10%以上。但是,如果线程成为问题,AtomicLong可能比其他线程更具吸引力(我不确定)。我也用final
变量运行了TestForNull ,但是差别可以忽略不计。
请注意,我没有介绍不同情况下的内存使用情况。我很高兴听到任何对MutableInt和Trove方法将如何影响内存使用情况有深刻见解的人。
我个人认为MutableInt方法最吸引人,因为它不需要加载任何第三方类。因此,除非我发现问题,否则这是我最有可能采取的方法。
代码 这是每种方法的关键代码。
import java.util.HashMap;
import java.util.Map;
...
Map<String, Integer> freq = new HashMap<String, Integer>();
...
int count = freq.containsKey(word) ? freq.get(word) : 0;
freq.put(word, count + 1);
import java.util.HashMap;
import java.util.Map;
...
Map<String, Integer> freq = new HashMap<String, Integer>();
...
Integer count = freq.get(word);
if (count == null) {
freq.put(word, 1);
}
else {
freq.put(word, count + 1);
}
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
...
final ConcurrentMap<String, AtomicLong> map =
new ConcurrentHashMap<String, AtomicLong>();
...
map.putIfAbsent(word, new AtomicLong(0));
map.get(word).incrementAndGet();
import gnu.trove.TObjecTintHashMap;
...
TObjecTintHashMap<String> freq = new TObjecTintHashMap<String>();
...
freq.adjustOrPutValue(word, 1, 1);
import java.util.HashMap;
import java.util.Map;
...
class MutableInt {
int value = 1; // note that we start at 1 since we're counTing
public voID increment () { ++value; }
public int get () { return value; }
}
...
Map<String, MutableInt> freq = new HashMap<String, MutableInt>();
...
Mutableint count = freq.get(word);
if (count == null) {
freq.put(word, new MutableInt());
}
else {
count.increment();
}
我希望这个问题对于本论坛来说不是太基本了,但是我们会看到的。我想知道如何重构一些代码以获得更好的性能,而这些性能已经运行了很多次。
假设我正在使用地图(可能是HashMap)创建一个单词频率列表,其中每个键是一个带有要计数单词的字符串,并且值是一个整数,每次找到该单词的标记时,该值就会递增。
在Perl中,增加这样的值非常容易:
$map{$worD}++;
但是在Java中,它要复杂得多。这是我目前的操作方式:
int count = map.containsKey(word) ? map.get(word) : 0;
map.put(word,count + 1);
当然,哪个依赖于新Java版本中的自动装箱功能。我想知道你是否可以建议一种更有效的递增此值的方法。避开Collections框架并改用其他方法,甚至有良好的性能原因吗?
以上是大佬教程为你收集整理的用Java增加Map值的最有效方法全部内容,希望文章能够帮你解决用Java增加Map值的最有效方法所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。