对于Map,我只知道它存储的数据是键值对形式,要增加一个数据的时候,就put(key,value),取一个键的值就get(key)。很少会用到遍历,或者用到遍历的时候,就去网上直接copy一段代码,然后不了了之,但是不知道为什么要这样用。今天对Map遍历进行一个总结。

简介

对于Map,我只知道它存储的数据是键值对形式,要增加一个数据的时候,就put(key,value),取一个键的值就get(key)。很少会用到遍历,或者用到遍历的时候,就去网上直接copy一段代码,然后不了了之,但是不知道为什么要这样用。今天对Map遍历进行一个总结,常用方法如下:

在for-each中遍历 map.entrySet()生成的Set>集合,可以同时得到key和value。

遍历map对象keySet()方法生成的Set集合或values()方法生成的Collection集合,这种方式只能得到key或者value。

通过集合的iterator()方法进行遍历(用iterator方法进行遍历在上篇总结中已经说明其原理)

for-each中遍历 map.entrySet()

首先我们通过源码来看看map.entrySet() 是个什么东西:HsahMap 1004行 jdk1.8

public Set> entrySet() {

Set> es;

return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;

}

final class EntrySet extends AbstractSet> {

public final int size() { return size; }

public final void clear() { HashMap.this.clear(); }

public final Iterator> iterator() {

return new EntryIterator();

}

public final boolean contains(Object o) {

if (!(o instanceof Map.Entry))

return false;

Map.Entry,?> e = (Map.Entry,?>) o;

Object key = e.getKey();

Node candidate = getNode(hash(key), key);

return candidate != null && candidate.equals(e);

}

public final boolean remove(Object o) {

if (o instanceof Map.Entry) {

Map.Entry,?> e = (Map.Entry,?>) o;

Object key = e.getKey();

Object value = e.getValue();

return removeNode(hash(key), key, value, true, true) != null;

}

return false;

}

public final Spliterator> spliterator() {

return new EntrySpliterator<>(HashMap.this, 0, -1, 0, 0);

}

public final void forEach(Consumer super Map.Entry> action) {

Node[] tab;

if (action == null)

throw new NullPointerException();

if (size > 0 && (tab = table) != null) {

int mc = modCount;

for (int i = 0; i < tab.length; ++i) {

for (Node e = tab[i]; e != null; e = e.next)

action.accept(e);

}

if (modCount != mc)

throw new ConcurrentModificationException();

}

}

}

Map.Entry : Map 375行

由上面的代码我们可以看到,entrySet()方法返回的是一个Set> 集合(即map中所存储的数据),而Set实现了Iterator接口,而实现了Iterator方法的对象好像都可以使用for-each语法,所以这里我们可以通过使用for-each中遍历 map.entrySet(),从而达到遍历map的效果。

遍历map对象keySet()方法生成的Set集合或values()方法生成的Collection集合

我们先来看看keySet() 和 values() 方法:HsahMap 904行 和 950 行

//904

public Set keySet() {

Set ks = keySet;

if (ks == null) {

ks = new KeySet();

keySet = ks;

}

return ks;

}

//950

public Collection values() {

Collection vs = values;

if (vs == null) {

vs = new Values();

values = vs;

}

return vs;

}

得到一个Set集合或者Collection集合,再进行遍历,这次就很方便了吧。

通过集合的iterator()方法进行遍历

这个方法比较好理解,就是先通过map.entrySet()方法得到一个Set集合,然后利用集合的iterator方法进行遍历,也就是:

Iterator iterator = map.entrySet().iterator();

while(iterator .hasNext()){

......

}

实例分析

package com.hand.hsp;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

/**

* Created by Moxie on 2016/12/25.

*/

public class TraverseMap {

public static void main(String[] args){

Map map = new HashMap ();

map.put("one","Hello one");

map.put("two","Hello two");

//for-each中遍历 map.entrySet()

for(Map.Entry entry : map.entrySet()){

System.out.println("key "+entry.getKey() +" value"+entry.getValue());

}

//遍历map对象keySet()方法生成的Set集合或values()方法生成的Collection集合

for(String key : map.keySet()){

System.out.println("key "+key);

}

for(String value : map.values()){

System.out.println("value "+value);

}

//通过集合的iterator()方法进行遍历

Iterator> iterator = map.entrySet().iterator();

while(iterator.hasNext()){

Map.Entry entry = iterator.next();

System.out.println("key "+entry.getKey() +" value"+entry.getValue());

}

}

}

java遍历map集合_Java 遍历Map集合相关推荐

  1. java遍历一个map集合_Java遍历Map集合的四种方式

    Map 集合的遍历与 List 和 Set 集合不同.Map 有两组值,因此遍历时可以只遍历值的集合,也可以只遍历键的集合,也可以同时遍历.Map 以及实现 Map 的接口类(如 HashMap.Tr ...

  2. java list《》_Java中List集合的遍历

    一.对List的遍历有三种方式 List    list    =    new    ArrayList(); list.add("testone"); list.add(&qu ...

  3. java 定义map集合_java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  4. java map 实例_java中map集合嵌套形式简单示例

    定义了一个学生类,封装了id和name属性,提供一个全参构造器,并复写toSting方法 class Student{ private String id; private String name; ...

  5. java map 数组_java技术Spring集合属性

    集合属性 在Spring中可以通过一组内置的XML标签来配置集合属性,例如:<list>,<set>或<map>. 1 数组和List 配置java.util.Li ...

  6. java 中的集合_JAVA中的集合

    JAVA中集合,是java中的基础概念,今天接着跟讲课准备课件的机会,重新整理一下关于JAVA中的集合的概念. 集合的概念 java中的集合类是用来存放对象的 集合相当于一个容器,里面包容着一组对象- ...

  7. java三大集合_java中三大集合框架

    一.List集合 1.List实现的超级父类接口:Collection 存储一组不唯一(允许重复),有序的对象. 2.了解ArrayList类 A):定义的格式:ArrayList 集合名 =  ne ...

  8. java 循环list 对象_java计算list集合中重复对象的次数及for循环内外创建对象

    我的需求:计算字符串集合中"数值"出现的次数,然后在for循环中计算"数值"及出现的次数 解决方案: 1.使用collections类中的frequency(集 ...

  9. java 数组长度 可变_java基础之集合长度可变的实现原理

    首先我们要明白java中的集合Collection,List,ArrayList之间的关系: ArrayList是具体的实现类,实现了List接口 List是接口,继承了Collection接口 Li ...

  10. java中map类型_Java中Map类型遍历的两种方式对比

    Java中Map类型是存储键值对数据的类型,在编程过程经常使用,进行遍历操作对于每个Java程序员都不会模式,下面总结两种常用的遍历方式(一种keySet,一种entrySet),通过对比让你明白使用 ...

最新文章

  1. MyBatis源码:原来 resultMap 解析完是这样
  2. android rom 评测,腾讯定制Android 4.0 ROM评测 附tati刷机教程
  3. UA CSC696H 强化学习理论选讲1 强化学习概览
  4. 状态压缩 HDU 1565
  5. 17.3.12---urlparse模块的URL下载
  6. Matplotlib 绘图秘籍
  7. 支付宝小程序组件库开发之自定义switch组件
  8. MVC3学习第六章 排山倒海第二变----使用 Entity Framework Code-First 进行数据访问
  9. linux运维好书《高性能Linux服务器构建实战Ⅱ》已出版发售,附封面照!
  10. 地理加权回归简易总结
  11. Jenkins--发送邮件配置
  12. 华为U2000网管研究实录 (4) - 运行分析(系统监控客户端)
  13. mui 控制旋转屏幕方向
  14. android手机传感器,安卓手机传感器
  15. 金融产业数据治理实践及方法论
  16. 在Excel中激活数据分析工具
  17. 程序员相亲被大三岁的富婆姐姐看上,让他当《杭州赘婿》
  18. percona xtrabackup 之一 setup
  19. 根据日期推算星期和历法由来
  20. PRML《模式识别与机器学习》的Python3代码实现

热门文章

  1. 任意门怎么用团发_任意门日淘app官方手机版-任意门日淘安卓版下载v1.4.6-壹六下载...
  2. DDPush 任意门消息推送 开源免费实时信息推送服务器
  3. 计算机操作系统第六章测试题及答案
  4. 魔兽世界服务器文件,【魔兽世界7.35】魔兽一键安装服务端[带GM管理工具]
  5. 360se html怎么删除,360安全浏览器服务组件能删除吗 如何删除
  6. 常见网络安全威胁及防范
  7. vue改页面顶部浏览器标题栏图标、名称和地址栏详细教程
  8. 网络营销练习题(黑大电商专业kaoti)
  9. npm 可视化html编辑器,Vue + element从零打造一个H5页面可视化编辑器——pl-drag-template...
  10. 工作中用到的sh脚本(持续更新)