HashMap计数器的高效实现

java-计数器 第一种,最直观的计数器 每次循环都去检查Map中是否包含Key,如果包含则将原值+1再保存,如果不存在,则直接保存1.这种方式是最简单直接的一种方式,但是并不是最有效的方式,其低效的原因: 1、如果已经存在某个key(a),containsKey()和get()方法会扫描Map两次2、由于Integer是不可变对象,因此每次循环,都会创建一个新的对象放到Map中。public void naiv 阅读详情

原始的计数器

在实际应用中,我们经常把HashMap作为一个计数器使用.例如统计一篇文章中单词 'the' 出现了多少次.于是我们很轻松地就能写出下面的程序:
Map<String, Integer> counter = new HashMap<String, Integer>();
		for(String s : strs) {
			if(counter.containsKey(s)) {
				Integer times = counter.get(s);
				times = times + 1;
			} else {
				counter.put(s, 1);
			}
		}

这个计数器确实可以完成我们所需的功能,但在速度上却慢了点.仔细分析不难发现,由于Integer是immutable的,即不可变的,所以在执行times = times + 1这行代码时实际上会创建一个新的Integer对象,然后再赋给times.这样一来,每次将次数 +1 时都会创建一个Integer,等循环执行完内存中可能会存在成千上万个垃圾Integer对象.所以,如果能将不可变的Integer改成可变的(mutable),能提高程序性能.

改进后的计数器

我们可以自己定义一个名为MutableInteger 的类来实现可变:
class MutableInteger {
	int value;
	
	public MutableInteger(int val) {
		this.value = val;
	}

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}
}

改进后的程序代码如下:
Map<String, MutableInteger> counter = new HashMap<String, MutableInteger>();
		for(String s : strs) {
			if(counter.containsKey(s)) {
				MutableInteger times = counter.get(s);
				times.setValue(times.getValue() + 1); // 不会每次都创建新对象了
			} else {
				counter.put(s, new MutableInteger(1));
			}
		}

做完这步工作以后,再进行分析,也不难发现,在第一个if分支中,HashMap实际上会被查找2次.即,containsKey()会做一次查找,put()又会进行一次查找.显然这样也会降低程序性能.我们可以进一步优化程序,使其只进行一次查找就能完成所有的操作.

高效的计数器

代码如下:
Map<String, MutableInteger> counter = new HashMap<String, MutableInteger>();
		for(String s : strs) {
			MutableInteger newValue = new MutableInteger(1);
			MutableInteger oldValue = counter.put(s, newValue);
			
			if(null != oldValue) {
				newValue.setValue(oldValue.getValue() + 1);
			}
		}

这段代码看进来好像有些不好理解,我们来分析一下:
1. 执行
MutableInteger newValue = new MutableInteger(1);
时,会创建一个新的MutableInteger对象,初始化为1.
2. 执行
MutableInteger oldValue = counter.put(s, newValue);
时,程序会将刚刚创建的newValue放到HashMap中,同时返回执行完put()方法之后当前的健所对应的值.
3. 如果oldValue为不为空,则说明原来的HashMap中没有这个键.而此时我们已经将没有的键put进去了,且其对应的值恰好是newValue所引用的对象.因此我们只需要通过newValue调用setValue()方法就能修改到值了.

我编写了一个测试程序,对这3个counter进行了性能对比,结果如下:


大概是8 : 7 : 6.
黑群晖二合一已损毁_手动修复黑群晖已损毁磁盘空间 lz的用法是这样的,一个中古级mac mini 2011上装有vmware esxi 7.6, 然后上面挂载了lz的华芸Asustor Nas的iscsi空间,lz用的是basic volume,然后esxi上面有虚拟的黑群晖6.2.2-24922,黑群晖的docker里跑着不可描述软件,但是发现下载速度过快时,比如有好几个文件同时下载,总速度超过60MB/s以后storage manager里很... 阅读详情

相关推荐

ArcMap学习笔记(三)地图数字化

地图数字化前言地图数字化实现步骤1.加载地形图2.新建要素图层3.开启编辑环境4.设置捕捉环境5.选择数字化图层6.数字化控制点7.数字化等高线8.数字化图幅边框9.保存数字化成果总结 前言 使用软件:ArcMap10.4.1中文版 如果出现侵权,请在评论留言,我会及时删除,谢谢。 地图数字化 空间数据采集(输入)是将现有的地图、外业观测成果、航空像片、遥感图片数据、文本资料等转换成GIS可以直接...

JayWang博客 1万+

哈希表之哈希集和哈希映射详解(c++),包括hash.count()和hash.fine()的使用。

哈希表中的哈希集和哈希映射,包括建立哈希集,插入键,删除键,搜索键,遍历哈希集详解;和建立哈希映射,插入键值对,删除键值对,搜索键值对,遍历哈希映射详解。包括hash.count()和hash.fine()的使用

weixin_45249333的博客 4975

ArcGIS实战:手把手教你用DEM和灾害点数据,5步搞定地质灾害风险区划图

本文详细介绍了使用ArcGIS进行地质灾害风险评估的完整流程,从DEM和灾害点数据出发,通过五步标准化操作生成专业风险区划图。重点讲解了信息量模型的应用,帮助读者掌握GIS技术在地质灾害易发性评价中的实践方法,提升风险评估效率与准确性。

weixin_30696427的博客 422

C++ STL中哈希表 hash_map从头到尾详细介绍

0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华山派掌门人,人称君子剑 张三丰-武当掌门人,太极拳创始人 东方不败-第一高手,葵花宝典 ... 这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信

susandebug 7万+

实用工具系列 - Xshell安装下载与使用

一、介绍 二、下载 三、安装 四、使用

Passerby_Wang的博客 1万+

C++ map和hashmap用法

1,map简介 map是STL的一个关联容器,它提供一对一的hash。 第一个可以称为关键字(key),每个关键字只能在map中出现一次; 第二个可能称为该关键字的值(value); map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内...

qq_33216029的博客 7万+

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 685

Rust 16: HashMap掰开揉碎:数组 + 哈希冲突处理 + 扩容

包含四部分:HashMap的底层数组存储结构和基本原理;如何处理Hash碰撞;如何扩容;Rust中HashMap的使用。

编程架构三分天下:分层、分治、分时序。 2302

T型三电平逆变器中点电位平衡详解

T型三电平逆变器(T-type Three-Level Inverter)是一种高效的多电平拓扑,相比传统NPC(Neutral Point Clamped)三电平逆变器,具有更低的开关损耗、更高效率和更简单的结构,尤其适用于中功率应用(如光伏逆变器、风电变换器和工业驱动)。(T-type Three-Level Inverter)中的应用已成为当前中高压功率变换领域(如光伏逆变器、储能PCS、电动汽车充电桩、风电并网和工业驱动)的热门方案。针对 T型逆变器,类似 NPC 的零序注入法适用。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 542

uniapp ios原生插件开发 (framework,cocoapods)

已知UniApp的插件开发方式有两种, 第一种 Xcode Framework的方式,这种方式是官方指定的方式。 这种方式的优点就是简单直接, 但也有不足,比如当插件需要引入一些三方库时,操作起来就不是那么方便。 而使用Cocoapods则可以很方便的引入三方库。 接下来,本文探索使用Cocoapods的方式来进行UniApp插件开发。

Rey的技术博客 9821

java中的计数器_在java中高效的计数器

在编程中,经常会用到HashMap作为计数器,本文简单介绍三种实现方式第一种,最直观的计数器。public void naiveCounter(String sArr[]) {HashMap counter = new HashMap();for (String a : sArr) {if (counter.containsKey(a)) {int oldValue = counter.get(a...

weixin_39793553的博客 1420

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java实现的高效计数器

1.  2.  3.  4. 性能差异 5. Keith的评论(如下所示) 6. 总结 原文地址:Efficient Counter in Java

young4u 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

黑马程序员_java高效计数器

你可能经常使用HashMap作为一个计数器来理解频率的东西从数据库或文本。本文比较了3种不同的方法来实现计数器使用HashMap。 1、传统的计数器 如果你使用这样一个计数器,你的代码可能看起来像下面的: String s = "one two three two three three"; String[] sArr = s.split(" ");   //naive approach

hyrzzh的专栏 813

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

在java中高效的计数器

在编程中,经常会用到HashMap作为计数器,本文简单介绍三种实现方式 1、第一种,最直观的计数器。

1358

页码计数java_Java实现的高效计数器

本文转载地址:在统计来自数据库或文本中某些内容的频率时,你可能经常会用到HashMap。本文对比了三种用HashMap实现的计数器。1. 简单的计数器如果你使用这样一个计数器,你的代码可能如下:Strings="onetwothreetwothreethree";String[]sArr=s.split("");//naiveapproachHashMapcounter...

weixin_39637661的博客 165

java 计数器_Java中的高效计数器全收录

您可能经常需要计数器来了解数据库或文本文件中某些内容(例如单词)的出现频率。通过使用Java中的HashMap可以轻松实现计数器。本文比较了实现计数器的不同方法。最后,将得出一个有效的结论。1. 天真版计数器天真版的,它可以通过以下方式实现:String s = "one two three two three three";String[] sArr = s.split(" ");//naive...

weixin_39662228的博客 183

Java中的高效计数器全收录

您可能经常需要计数器来了解数据库或文本文件中某些内容(例如单词)的出现频率。通过使用Java中的HashMap可以轻松实现计数器。本文比较了实现计数器的不同方法。最后,将得出一个有效的结论。 天真版计数器 天真版的,它可以通过以下方式实现: String s = “one two three two three three”;String[] sArr = s.split(" "); //na...

阿志同学 405

【Rust自学】8.6. HashMap Pt.2:更新HashMap

HashMap的大小可变指的是其中的键值对数量可变,但是在每个时刻一个键只能对应一个值,当想要更新HashMap中的数据的时候,可能有这么几种情况: - 想要更新的键在HashMap中已经存在一个对应的值: - 用新的值代替现有的值 - 保留现有的值,忽略新的值 - 合并现有的值和新的值,也就是说对现有的值进行修改

A Rookie in San Domenico School 1521

深入理解RedBPF映射:HashMap、Array与PerCpuArray使用详解

RedBPF是一个强大的Rust库,专为构建和运行BPF/eBPF模块而设计。在RedBPF中,映射(Maps)是BPF程序与用户空间之间共享数据的核心机制,其中HashMap、Array和PerCpuArray是最常用的三种映射类型。本文将详细介绍这三种映射的特性、适用场景和使用方法,帮助开发者高效利用RedBPF进行eBPF程序开发。 ## RedBPF映射基础概述 RedBPF提供了多种

gitblog_00243的博客 389

Java高效计数器

本文转载地址: http://blog.youkuaiyun.com/renfufei/article/details/14120775 我们经常使用 HashMap作为计数器(counter)来统计数据库或者文本中的某些东西. 本文将使用HashMap来实现计数器的3种不同方式进行对比。 1. 新手级计数器 如果使用这一类别的计数器,那么代码大致如下所示: ...

weixin_34258078的博客 121

LeetCode 350:两个数组的交集Ⅱ

LeetCode 350:两个数组的交集Ⅱ题目描述解题思路代码实现总结 题目描述 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个...

香农三定律的博客 249
上一篇: Java对象的内存模型
下一篇: 如何重写hashCode()和equals()方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值