Java 遍历Map集合

简介

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

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

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对象keySet()方法生成的Set集合或values()方法生成的Collection集合

我们先来看看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());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值