谨慎使用keySet:对于HashMap的2种遍历方式比较
2024-09-04 00:36:30
HashMap存储的是键值对,所以一般情况下其遍历同List及Set应该有所不同.
但java巧妙的将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了HashMap的遍历处理,使其遍历同List、Set并无差异.
第一种:
Java代码
- Map map = new HashMap();
- Iterator iter = map.entrySet().iterator();
- while (iter.hasNext()) {
- java.util.Map.Entry entry = (Map.Entry) iter.next();
- Object key = entry.getKey();
- Object val = entry.getValue();
- }
第二种:
Java代码
- Map map = new HashMap();
- Iterator iter = map.keySet().iterator();
- while (iter.hasNext()) {
- Object key = iter.next();
- Object val = map.get(key);
- }
例如:
HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例:
Java代码
- public class HashMapTest {
- public static void main(String[] args) ...{
- HashMap hashmap = new HashMap();
- for (int i = 0; i < 1000; i ) ...{
- hashmap.put("" i, "that's all");
- }
- long num = Calendar.getInstance().getTimeInMillis();
- Iterator iterator = hashmap.keySet().iterator();
- while (iterator.hasNext()) ...{
- System.out.print(hashmap.get(iterator.next()));
- }
- System.out.println();
- System.out.println(Calendar.getInstance().getTimeInMillis() - num);
- listHashMap();
- }
- public static void listHashMap() ...{
- java.util.HashMap hashmap = new java.util.HashMap();
- for (int i = 0; i < 1000; i ) ...{
- hashmap.put("" i, "that's all");
- }
- long num = Calendar.getInstance().getTimeInMillis();
- java.util.Iterator it = hashmap.entrySet().iterator();
- while (it.hasNext()) ...{
- java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
- // entry.getKey() 返回与此项对应的键
- // entry.getValue() 返回与此项对应的值
- System.out.print(entry.getValue());
- }
- System.out.println();
- System.out.println(Calendar.getInstance().getTimeInMillis() - num);
- }
- }
看JDK源码,对比两种访问方式:
首先看KeySet访问方式:
Java代码
- public Set<K> keySet() {
- if (keySet == null) {
- keySet = new AbstractSet<K>() {
- public Iterator<K> iterator() {
- return new Iterator<K>() {
- private Iterator<Entry<K,V>> i = entrySet().iterator();
- public boolean hasNext() {
- return i.hasNext();
- }
- public K next() {
- return i.next().getKey();
- }
- public void remove() {
- i.remove();
- }
- };
- }
- public int size() {
- return AbstractMap.this.size();
- }
- public boolean contains(Object k) {
- return AbstractMap.this.containsKey(k);
- }
- };
- }
- return keySet;
- }
结论:
通过上边的测试我们可以看出,采用entrySet方式遍历效率要优于keySet,因此在开发中要使用entrySet,尽量避免少使用keySet。
最新文章
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
- 另类vs2015+xamarin 的android界面乱码 解决
- ios更新UI时请尝试使用performSelectorOnMainThread方法
- [设计模式] javascript 之 迭代子模式
- 整理string类常见方法的使用说明
- 传参方式由url携带改为post提交
- Oracle Enterprise Linux 64-bit下安装apache-tomcat-7.0.53步骤
- printf ";%.*s"; 分类: 小细节 2015-07-04 14:36 2人阅读 评论(0) 收藏
- Verilog语言实现并行(循环冗余码)CRC校验
- Jmter接口网站压力测试工具使用记录
- 别人的Linux私房菜(23)软件安装RPM、SRPM、YUM
- 手动部署 kubernetes 1.9 记录
- vue 项目其他规范
- elasticsearch更改mapping,不停服务重建索引(转)
- Spark的启动进程详解
- docker 下载加速
- ANT DESIGN PRO 脚手架.... 懒人福音
- CSS过渡动画之transition
- djb2:一个产生简单的随机分布的哈希函数
- 九 assign和subscribe
热门文章
- Python - 面向对象(二)类方法、静态方法
- nmon使用问题汇总(不定期更新)
- 【面试必备】用了那么多次 ping,是时候知道 ping 是如何工作的了!
- 阿里淘宝的S1级别bug,到底是谁的锅?
- c# 对SOAP返回XML字符串的解析方法
- C语言经典练习题:水仙花数
- hdu2087kmp模板练习
- Matplotlib 精简实例入门
- [最短路,最大流最小割定理] 2019 Multi-University Training Contest 1 Path
- Ubuntu18.04下安装MySQL5.7(支持win10-wsl环境)