Java 遍历Map集合
Java 遍历Map集合
spilledyear 发表于4个月前
Java 遍历Map集合
  • 发表于 4个月前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

对于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());
        }
    }
}

标签: Java 集合 Map 遍历
共有 人打赏支持
粉丝 0
博文 8
码字总数 4806
×
spilledyear
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: