java计数器_Java高效计数器

翻译人员: 铁锚

翻译时间: 2013年11月3日

原文链接: Efficient Counter in Java

我们经常使用 HashMap作为计数器(counter)来统计数据库或者文本中的某些东西.

本文将使用HashMap来实现计数器的3种不同方式进行对比。

1. 新手级计数器

如果使用这一类别的计数器,那么代码大致如下所示:

String source = "my name is name me and your name is her first her";

String[] words = source.split(" ");

// 新手级计数器

public static void testNaive(String[] words){

HashMap counter = new HashMap();

for (String w : words) {

if(counter.containsKey(w)){

int oldValue = counter.get(w);

counter.put(w, oldValue+1);

} else {

counter.put(w, 1);

}

}

}

在每次循环中,判断是否包含了相应的key,如果包含,那么值在原来的基础上加1,如果没有,那就设置为1.

此种方式简单又直接,但并不是很有效率。效率不高的原因如下:

1.1 当一个key存在时,containsKey() 和 get() 分别调用了一次,这意味着对map进行了两次查找。

1.2 因为 Integer 是不可变的,每次循环在增加计数值的时候将会创建一个新的对象.

2. 入门级计数器

那么我们自然需要使用一个可变的整数来避免创建太多个Integer对象.可变整数类可以如下面所示来定义:

// 可变Integer

public static final class MutableInteger{

private int val;

public MutableInteger(int val){

this.val = val;

}

public int get(){

return this.val;

}

public void set(int val){

this.val = val;

}

// 为了方便打印

public String toString() {

return Integer.toString(val);

}

}

那么计数器可以用如下的方式来改进:

// 入门级计数器

public static void testBetter(String[] words){

HashMap counter = new HashMap();

for (String w : words) {

if(counter.containsKey(w)){

MutableInteger oldValue = counter.get(w);

oldValue.set(oldValue.get()+1);// 因为是引用,所以减少了一次HashMap查找

} else {

counter.put(w, new

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值