通过一个实际案例,彻底搞懂 HashMap!

本文通过一个用户提交试卷答案的场景,解释了如何利用HashMap高效地比对题目和答案,避免了传统双层循环的性能问题。阐述了HashMap的基本特性和工作原理,包括其基于哈希表的实现、允许空值、恒定时间复杂度的get和put操作,以及冲突解决策略。最后介绍了put操作的详细流程,包括碰撞处理、插入和更新操作以及扩容机制。
摘要由CSDN通过智能技术生成

我知道大家都很熟悉hashmap,并且有事没事都会new一个,但是hashmap的一些特性大家都是看了忘,忘了再记,今天这个例子可以帮助大家很好的记住。

场景

用户提交一张试卷答案到服务端,post报文可精简为

[{ "question\_id" : "100001", "answer" : "A" },
 { "question\_id" : "100002", "answer" : "A" },
 { "question\_id" : "100003", "answer" : "A" },
 { "question\_id" : "100004", "answer" : "A" }]

提交地址采用restful风格

http://localhost:8080/exam/{试卷id}/answer

那么如何比对客户端传过来的题目就是这张试卷里的呢,假设用户伪造了试卷怎么办?

正常解决思路

1、得到试卷所有题目id的list

2、2层for循环比对题号和答案

3、判定分数

大概代码如下

/* 读取post题目 */
for ( MexamTestpaperQuestion mexamTestpaperQuestion : mexamTestpaperQuestions )
{
	/* 通过考试试卷读取题目选项对象 */
	MexamQuestionOption questionOption = mexamQuestionDao.findById( mexamTestpaperQuestion.getQuestionId() );
	map1.put( "questionid", mexamTestpaperQuestion.getQuestionId() );
	map1.put( "answer", mexamQuestionDao.findById( mexamTestpaperQuestion.getQuestionId() ).getAnswer() );
	questionAnswerList.add( map1 );
	/* 将每题分add到一个List */
}

/* 遍历试卷内所有题目 */
for ( Map<String, Object> stringObjectMap : list )
{
	/* 生成每题结果对象 */
	mexamAnswerInfo = new MexamAnswerInfo();
	mexamAnswerInfo.setAnswerId( answerId );
	mexamAnswerInfo.setId( id );
	mexamAnswerInfo.setQuestionId( questionid );
	mexamAnswerInfo.setResult( anwser );
	for ( Map<String, Object> objectMap : questionAnswerList )
	{
		if ( objectMap.get( "questionid" ).equals( questionid ) )
		{
			/* 比较答案 */
			if ( anwser.equals( objectMap.get( "answer" ) ) )
			{
				totalScore += questionOption.getScore();
				mexamAnswerInfo.setIsfalse( true );
			}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值