java遍历map集合_Java 遍历Map集合
對于Map,我只知道它存儲的數(shù)據(jù)是鍵值對形式,要增加一個(gè)數(shù)據(jù)的時(shí)候,就put(key,value),取一個(gè)鍵的值就get(key)。很少會用到遍歷,或者用到遍歷的時(shí)候,就去網(wǎng)上直接copy一段代碼,然后不了了之,但是不知道為什么要這樣用。今天對Map遍歷進(jìn)行一個(gè)總結(jié)。
簡介
對于Map,我只知道它存儲的數(shù)據(jù)是鍵值對形式,要增加一個(gè)數(shù)據(jù)的時(shí)候,就put(key,value),取一個(gè)鍵的值就get(key)。很少會用到遍歷,或者用到遍歷的時(shí)候,就去網(wǎng)上直接copy一段代碼,然后不了了之,但是不知道為什么要這樣用。今天對Map遍歷進(jìn)行一個(gè)總結(jié),常用方法如下:
在for-each中遍歷 map.entrySet()生成的Set>集合,可以同時(shí)得到key和value。
遍歷map對象keySet()方法生成的Set集合或values()方法生成的Collection集合,這種方式只能得到key或者value。
通過集合的iterator()方法進(jìn)行遍歷(用iterator方法進(jìn)行遍歷在上篇總結(jié)中已經(jīng)說明其原理)
for-each中遍歷 map.entrySet()
首先我們通過源碼來看看map.entrySet() 是個(gè)什么東西: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()方法返回的是一個(gè)Set> 集合(即map中所存儲的數(shù)據(jù)),而Set實(shí)現(xiàn)了Iterator接口,而實(shí)現(xiàn)了Iterator方法的對象好像都可以使用for-each語法,所以這里我們可以通過使用for-each中遍歷 map.entrySet(),從而達(dá)到遍歷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;
}
得到一個(gè)Set集合或者Collection集合,再進(jìn)行遍歷,這次就很方便了吧。
通過集合的iterator()方法進(jìn)行遍歷
這個(gè)方法比較好理解,就是先通過map.entrySet()方法得到一個(gè)Set集合,然后利用集合的iterator方法進(jìn)行遍歷,也就是:
Iterator iterator = map.entrySet().iterator();
while(iterator .hasNext()){
......
}
實(shí)例分析
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()方法進(jìn)行遍歷
Iterator> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry entry = iterator.next();
System.out.println("key "+entry.getKey() +" value"+entry.getValue());
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java遍历map集合_Java 遍历Map集合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设有n个正整数,将他们连接成一排,组成一
- 下一篇: Java中遍历Map集合的五种方式