keySet()与entrySet()遍历的性能比较_hehefefe的博客-程序员秘密

技术标签: Java  java  

在做项目的时候有邮件发送方面的业务.对邮件的收发的业务不是很清楚,这几天重点在恶搞JavaMail.邮件系统的开发在一般的项目中都会用到,可以看出这一块的知识点用到的频率很高,所以必须来掌握它.这是老大写的一个邮件接口实现类(项目中的真实代码):

package com.tq.platform.service.core.impl;
import java.util.Iterator;
import java.util.Map;

import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.mail.MailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import com.tq.platform.service.core.MailManager;

/**
* 邮件接口实现类
*
* @author Vincent
*/
public class MailManagerImpl extends BaseManagerImpl implements MailManager {

private MailSender sender;

public void setSender(MailSender sender) {
this.sender = sender;
}

public void sendMessage(String from, String[] to, String subject,
String content) {
sendMessage(from, to, subject, content, null);
}

public void sendMessage(String from, String[] to, String subject,
String content, Map<String, DataSource> attachments) {
try {
MimeMessage message = ((JavaMailSenderImpl) sender).createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true,"UTF-8");
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
if (attachments != null) {
for (Iterator<String> iterator = attachments.keySet().iterator(); iterator.hasNext();) {
String fileName = iterator.next();
helper.addAttachment(fileName, attachments.get(fileName));
}
}
((JavaMailSenderImpl) sender).send(message);
}
catch (MessagingException e) {
e.printStackTrace();
}
}
}

今天在看这段代码的时候我发现了一个小小的问题那就是老大写的这个遍历:


for (Iterator<String> iterator = attachments.keySet().iterator(); iterator.hasNext();) {
String fileName = iterator.next();
helper.addAttachment(fileName, attachments.get(fileName));
}

其实这样是没问题的.[size=large][color=green]但我想用entrySet()是不是效率更高一点呢!!![/color][/size]
for (Iterator<Entry<String, DataSource>> iterator = attachments
.entrySet().iterator(); iterator.hasNext();) {
Entry<String, DataSource> fileName = iterator.next();
helper.addAttachment(fileName.toString(), attachments.get(fileName));
}

当然在数据并发量不大的系统上entrySet()的优势并不明显.
这里我也对entrySet(), keySet()的迭代时间做了一个简单的测试,其 entrySet()的遍历速度并不比keySet()的速度快,但在其应用开发中这些小细节一定要知道.
/**
* @Title: MapTest.java
* @Package: cn.tq.java.Test
* @Description: TODO(用一句话描述该文件做什么)
* @author: 何枫
* @date: 2011-9-8 上午11:14:27
* @version: V1.0
*/
package cn.tq.java.Test;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

/**
* @Title: MapTest.java
* @Package: cn.tq.java.Test
* @Description: TODO(用一句话描述该文件做什么)
* @author: 何枫
* @date: 2011-9-8 上午11:14:27
* @version: V1.0
*/
public class MapTest {

/**
* @Title: main
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param args 设定文件
* @return void 返回类型
* @throws 测试keySet
* ()与entrySet()的迭代时间 keySet():迭代后只能通过get()取key
* entrySet():迭代后可以e.getKey(),e.getValue()取key和value.返回的是Entry接口
* 其通过代码的形式验证keySet()的速度比entrySet()慢了很多
*/
public static void main(String[] args) {
Map<String, String> kmap = new HashMap<String, String>();
Map<String, String> smap = new HashMap<String, String>();
for (int k = 0; k < 100; k++) {
kmap.put("" + k, "kmap");
}
for (int s = 0; s < 100; s++) {
smap.put("" + s, "smap");
}
long ctimesStart = Calendar.getInstance().getTimeInMillis();
System.out.println(stimesStart + " " + ctimesStart + " "
+ dtimesStart);
System.out.println("初始化开始时间:" + stimesStart);
Iterator<String> ktor = kmap.keySet().iterator();
while (ktor.hasNext()) {
System.out.print(ktor.next() + "\t");
}
/*
* Iterator<Entry<String, String>> stor = smap.entrySet().iterator();
* while(stor.hasNext()){ Entry<String, String> s = stor.next();
* System.out.print(s.getKey()+"\t");
* //System.out.print(stor.next().getKey()+"\t"); }
*/
long ctimesEnd = Calendar.getInstance().getTimeInMillis();
System.out.print("\n");
System.out.print("初始化结束时间:" + ctimesEnd + "\n");
System.out.print((ctimesEnd - ctimesStart));
}

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hehefefe/article/details/84014815

智能推荐

SQL SERVER 2016安装部署_sql server2016安装教程_yleihj的博客-程序员秘密

4:可以安装指定的版本,Evaluation这个需要购买,Developer用于开发版本,Express功能少,但是没有限制。8:选择需要安装的组件,如果选择R服务后续需要下载R服务的离线安装包。也可以更改安装的路径,我安装在E盘。2:在计划中可以查看支持SQL SERVER 2016安装的软硬件条件等信息。3:在左侧安装中选择全新SQL Server独立安装或向现有安装添加功能。15:复制下面的两个地址,下载R Open和R Server离线安装包。11:选择混合验证,输入密码,并添加当前用户,下一步。

Oracle中字符串截取最全方法总结_keep12moving的博客-程序员秘密

https://blog.csdn.net/rongtaoup/article/details/82217740?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-16.control&amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-16.control

android os servicemanager,Android 之 ServiceManager与服务管理_xiong liu的博客-程序员秘密

ServiceMananger是android中比较重要的一个进程,它是在init进程启动之后启动,从名字上就可以看出来它是用来管理系统中的service。比如:InputMethodService、ActivityManagerService等。在ServiceManager中有两个比较重要的方法:add_service、check_service。系统的service需要通过add_servi...

ASP.NET中 MVC框架设置session过期后自动跳转登录页面_mvc session timeout 时间 web。config_小超zmc的博客-程序员秘密

使session过期后自动跳转登录页面步骤1.在web.config中设置session过期时间 单位分钟 &lt;system.web&gt; &lt;authentication mode="Forms"&gt; &lt;forms loginUrl="~/Home/Login" timeout="2880" defaultUrl="~/Home/Login" /&gt...

华为交换机Hybrid端口配置实验_华为混合端口配置实例_Ang.sut倾城♛ ♛的博客-程序员秘密

一、实验拓扑图: 二、实验要求:1.测试6台PC能否通信?(YES)2.配置1号交换机的E4端口为trunk端口,pvid为10,允许vlan102030通过。3.测试6台PC能否通信?(同一台交换机下可以,WHY?)4.根据图示分别配置两台交换机的E1-3号端口。5.将2号交换机E4端口配置成hybrid端口。6.续完成hybrid端口相应配置,使得3个VLAN内部能够完成通信(不考虑跨VLAN的通信)。三、配置命令与原...

随便推点

Java后端之路_IIRELIA的博客-程序员秘密

本文转自程序羊CodeSheep,留存在此方便查看:原文链接:https://blog.csdn.net/wangshuaiwsws95/article/details/106049247注:本文已经收录进开源项目:github.com/JavaCollection,有自学路线、面试题和面经、编程资料以及系列技术文章。前言这篇想写很久了,原以为一两天搞定,结果整理、串接、画图搞了一周多。经过一番梳理、虽然东西不少,但感觉还是挺清晰的,不说了,肝。前方高能一图胜千言,但凡能用图,就不想用

SD卡路径问题以及如何获取SDCard 内存_abc935991的博客-程序员秘密

SD卡路径问题以及如何获取SDCard 内存出处:http://www.360doc.com/content/12/0406/10/7471983_201318634.shtml#昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为:    private String folder = "/sdcard/DCIM/Camera/"(SD卡上拍照程序的图片存储路径); 后来发现这样

Cookie、Session和Token的区别与联系_小菜鸡本菜的博客-程序员秘密

以下是本人的一些笔记,助于理解概念,并不详细,详细内容可以参考文中提供的链接。一、HTTP的无状态性HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。假设要求登录认证的Web页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面不是要再次登录,就是要在每次请求报文中附加参数来管理登录状态。不可否认,无状态协议当然有它的优点。由于不必保存状态,自然可减少服务器的CPU及内存资源的消耗。从另一个角度来讲,也正是因为HTTP协议

golang 获取明天零点的时间戳_golang 计算第二天凌晨_一名路过的小码农的博客-程序员秘密

package mainimport ( "fmt" "time")func main() { timeStr := time.Now().Format("2006-01-02") fmt.Println(timeStr) //使用Parse 默认获取为UTC时区 需要获取本地时区 所以使用ParseInLocation t, _ := time.ParseInLocati

半夜钱款莫名被转走!睡觉手机到底该不该关机?安全专家解读新型网络盗窃!..._Python开发者的博客-程序员秘密

(点击上方公号,快速关注我们)来源:360 - 黄琳近期各地陆续发生一些利用短信验证码冒用身份的案件,攻击者窃取银行账户、金融类app中的财产,被害者甚至莫名“被网贷”,...

在 MQL5 中使用 WININET。第二部分:POST 请求和文件_MetaTrade的博客-程序员秘密

简介在前一课“使用 WinInet.dll 通过互联网在客户端之间交换数据”一课中,我们已经学习了如何使用库、打开网页、使用 GET 请求发送和接收信息。在本课中,我们将学习如何:创建简单的 POST 请求并将请求发送到服务器; 使用multipart/form-data表示法将文件发送到服务器; 使用 Cookie 并通过登录从网站读取信息。和以前一样,我强烈建议设置一台本地代理服务器Charles;对于您的学习和进一步试验,它将是必不可少的。POST 请求为了发送信...

推荐文章

热门文章

相关标签