博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java-计数器
阅读量:6315 次
发布时间:2019-06-22

本文共 2063 字,大约阅读时间需要 6 分钟。

第一种,最直观的计数器

每次循环都去检查Map中是否包含Key,如果包含则将原值+1再保存,如果不存在,则直接保存1.这种方式是最简单直接的一种方式,但是并不是最有效的方式,其低效的原因:

1、如果已经存在某个key(a),containsKey()和get()方法会扫描Map两次

2、由于Integer是不可变对象,因此每次循环,都会创建一个新的对象放到Map中。

public void naiveCounter(String sArr[]) {          HashMap
counter = new HashMap
(); for (String a : sArr) { if (counter.containsKey(a)) { int oldValue = counter.get(a); counter.put(a, oldValue + 1); } else { counter.put(a, 1); } } }

第二种,比较好的计数器

自然可以想到创建一个可变的Integer对象,这样可以避免创建过多的Integer对象

class MutableInteger {          private int val;          public MutableInteger(int val) {              this.val = val;          }          public int get() {              return val;          }          public void set(int val) {              this.val = val;          }          public String toString() {              return Integer.toString(val);          }      }
public void betterCounter(String[] sArr) {          HashMap
newCounter = new HashMap
(); for (String a : sArr) { if (newCounter.containsKey(a)) { MutableInteger oldValue = newCounter.get(a); oldValue.set(oldValue.get() + 1); } else { newCounter.put(a, new MutableInteger(1)); } } }

第三种,高效的计数器

已经解决了创建过多Integer对象的问题,但是扫描两次Map,其实在HashMap中,存在一个能够返回当前值的方法(HashMap.put(key,value)),在上面的基础上,我们可以通过对原来的引用进行更新,而不必扫描两次Map.

public void efficientCounter(String[] sArr) {          HashMap
efficientCounter = new HashMap
(); for (String a : sArr) { MutableInteger initValue = new MutableInteger(1); MutableInteger oldValue = efficientCounter.put(a, initValue); //MutableInteger是可变的,此处只需判断之前是否为空, // 如果非空,则更新MutableInteger的引用即可 if (oldValue != null) { initValue.set(oldValue.get() + 1); } } }

转载地址:http://fwrxa.baihongyu.com/

你可能感兴趣的文章
关于两个jar包中存在包名和类名都完全相同的jar包冲突问题
查看>>
【转】 在CentOS 6.5上使用yum安裝LAMP環境
查看>>
linux下的DNS解析之原理篇
查看>>
我的友情链接
查看>>
Ansible 基础
查看>>
jQuery-formvalidatior
查看>>
基于DIV+ul+li实现的表格(多示例)
查看>>
芯片级维修学习课程安排
查看>>
LayUI之layer关闭刷新父界面
查看>>
分布式事务
查看>>
在网页中发布WorldWind Applet程序遇到的问题
查看>>
python导入指定文件作为模块
查看>>
系统应急措施
查看>>
动态代理
查看>>
分布式集群系统下的高可用session解决方案
查看>>
心无法平静
查看>>
服务器部署raid5图解
查看>>
印度海得拉巴发生连环爆炸
查看>>
经典java转码程序,实现和 jdk\bin\native2ascii.exe 同样的功能
查看>>
警惕:移动应用App背后的安全危机!
查看>>