文档章节

Java 遍历Map集合

spilledyear
 spilledyear
发布于 2017/09/08 14:17
字数 897
阅读 8
收藏 0

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

简介

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

  • 在for-each中遍历 map.entrySet()生成的Set<Entry<Key,Value>>集合,可以同时得到key和value。
  • 遍历map对象keySet()方法生成的Set<Key>集合或values()方法生成的Collection<values>集合,这种方式只能得到key或者value。
  • 通过集合的iterator()方法进行遍历(用iterator方法进行遍历在上篇总结中已经说明其原理)

for-each中遍历 map.entrySet()

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

public Set<Map.Entry<K,V>> entrySet() {
        Set<Map.Entry<K,V>> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
    }

    final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
        public final int size()                 { return size; }
        public final void clear()               { HashMap.this.clear(); }
        public final Iterator<Map.Entry<K,V>> 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<K,V> 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<Map.Entry<K,V>> spliterator() {
            return new EntrySpliterator<>(HashMap.this, 0, -1, 0, 0);
        }
        public final void forEach(Consumer<? super Map.Entry<K,V>> action) {
            Node<K,V>[] 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<K,V> e = tab[i]; e != null; e = e.next)
                        action.accept(e);
                }
                if (modCount != mc)
                    throw new ConcurrentModificationException();
            }
        }
    }

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

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

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

//904
public Set<K> keySet() {
        Set<K> ks = keySet;
        if (ks == null) {
            ks = new KeySet();
            keySet = ks;
        }
        return ks;
}

//950
public Collection<V> values() {
        Collection<V> 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<String,String> map = new HashMap<String,String> ();
        map.put("one","Hello one");
        map.put("two","Hello two");

        //for-each中遍历 map.entrySet()
        for(Map.Entry<String,String> entry : map.entrySet()){
            System.out.println("key "+entry.getKey() +"             value"+entry.getValue());
        }

        //遍历map对象keySet()方法生成的Set<Key>集合或values()方法生成的Collection<values>集合
        for(String key : map.keySet()){
            System.out.println("key "+key);
        }
        for(String value : map.values()){
            System.out.println("value "+value);
        }

        //通过集合的iterator()方法进行遍历
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while(iterator.hasNext()){
            Map.Entry<String, String> entry = iterator.next();
            System.out.println("key "+entry.getKey() +"             value"+entry.getValue());
        }
    }
}

© 著作权归作者所有

共有 人打赏支持
spilledyear
粉丝 1
博文 8
码字总数 4806
作品 0
私信 提问
Scala笔记整理(二):Scala数据结构—数组、map与tuple

[TOC] 数组 定长数组 如果你需要一个长度不变的数组,可以用Scala中的Array。例如: 在JVM中,Scala的Array以Java数组方式实现。示例中的数组在JVM中的类型为java.lang.String[]。Int、Doubl...

xpleaf
04/18
0
0
kotlin学习笔记-异常好玩的list集合总结

不积跬步无以至千里,不积小流无以成江海 先看看Kotlin中for循环的遍历 kotlin和Java中的集合工具类 Java中集合及其工具类 Kotlin中Java中集合及其工具类 List MutableList Set MutableSet Ma...

codeGoogle
07/16
0
0
Java编程学习:集合框架详解

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/30
0
0
Java 新特性,使用 Lambdas 表达式作为 Predicates

以前我给过一个例子,查询地图的参数变成了 SOLR 的搜索字符串。在 Java 8 之前的代码使用传统的for循环条件和使用StringBuilder 逐步构建一个字符串。Java 8 代码使用 map 实体,映射(转换...

oschina
2016/09/21
3.2K
8
面试必备:30个Java集合面试问题及答案

Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点。这里,我列出了一些关于Java集合的重要问题和答案。 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中...

jamesese
08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery

语法 描述 实例 $("*") 选取所有元素 在线实例 $(this) 选取当前 HTML 元素 在线实例 $("p.intro") 选取 class 为 intro 的 <p> 元素 在线实例 $("p:first") 选取第一个 <p> 元素 在线实例 ...

mskk
11分钟前
0
0
微信红包设计方案

前言 微信红包一经推出,春节期间微信用户红包总发送量达80.8亿,红包峰值40.9w/秒,在如此量级下,系统设计存在各种变数,稍有闪失会功亏一篑。 红包系统 红包系统有三部分组成:信息流,业...

春哥大魔王的博客
21分钟前
0
0
微信开发-正式号的配置

1、设置相关 业务域名的设置(不设置的话,相关页面会显示防欺诈盗号信息提示) JS接口安全域名设置 网页授权域名设置 注意:以上三个设置中都有下载文件的提示,此文件内容一样,下载一个即可...

Code辉
26分钟前
1
0
微服务之Eureka服务发现

当调用API或者发起网络通信的时候,无论如何我们都要知道被调用方的IP和服务端口,大部分情况是通过域名和服务端口,事实上基于DNS的服务发现,因为DNS缓存、无法自治和其他不利因素的存在,...

架构师springboot
26分钟前
0
0
spring boot2 admin login

版本: admin server 配置 admin client 配置 参考资料

showlike
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部