文档章节

Java 遍历Map集合

spilledyear
 spilledyear
发布于 2017/09/08 14:17
字数 897
阅读 7
收藏 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
粉丝 0
博文 8
码字总数 4806
作品 0
kotlin学习笔记-异常好玩的list集合总结

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

codeGoogle
07/16
0
0
Scala笔记整理(二):Scala数据结构—数组、map与tuple

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

xpleaf
04/18
0
0
Java编程学习:集合框架详解

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

Java小辰
05/30
0
0
[Java 并发编程] 集合框架之 同步容器类 & 并发容器类

吾生也有涯,而知也无涯。———《庄子》 通过上一篇文章,我们已经知道设计一个线程安全类的原则和步骤,以及在设计过程中我们应当注意的细节。实际上,Java 的集合库包含了线程安全集合和非...

seaicelin
05/25
0
0
Java 8的Lambda VS Groovy的Closure

本文翻译自:http://www.javacodegeeks.com/2014/06/java-8-lambdas-vs-groovy-closures-compactness-grouping-and-summing.html Java 8已经支持lambdas,它很像Groovy早就支持的:闭包。 在......

翟志军
2014/07/18
0
2

没有更多内容

加载失败,请刷新页面

加载更多

5、前后端分离跨域问题

在以往的开发中,前后端分离也不是像现在这么热门,所谓的前端工程师也只不过是写好静态页面由Java工程师或者php工程师嵌入到页面中进行开发,这或许加重了这些工程师的工作量,而且在样式调...

永远的Chester
16分钟前
0
0
全志T3 Linux显示驱动分析

1、总体架构 全志T3处理器的显示框架是基于标准Linux的帧缓冲架构,其结构如图 1.1所示。显示控制器DE的驱动架构如图 1.2所示,包括屏蔽差异的显示管理抽象层,以及显示图层驱动、显示设备驱...

pnsam301
24分钟前
0
0
【HAVENT原创】VUE2 经验问题汇总

新建一个 Vue 实例可以有下列两种方式: 1. new 一个实例 var app= new Vue({ el:'#todo-app', // 挂载元素 data:{ // 在.vue组件中data是一个函数,要写成data () {}这种方式 i...

HAVENT
27分钟前
0
0
IO基础知识

读文件,可以使用内置的open(file,mode); with 语句自动close; 查看当前目录的绝对路径:os.path.abspath('.'); 创建目录:os.mkdir(path); 删除目录:os.rmdir(path); 拼接路径推荐使用:o...

年轻的中年大叔
30分钟前
0
0
BATJ等大厂最全经典面试题分享

金九银十,又到了面试求职高峰期,最近有很多网友都在求大厂面试题。正好我之前电脑里面有这方面的整理,于是就发上来分享给大家。 这些题目是网友去百度、蚂蚁金服、小米、乐视、美团、58、...

老道士
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部