第一种
先取出所有的Key,通过Key取出对应的Value
Map map = new HashMap();
Set keyset = map.keySet();
//(1)增强for
for (object key:keyset) {
System.out.println(key + "-" + map.get(key));
}
//(2)迭代器
Iterator iterator = keyst.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
第二种
把所有的values取出
Map map = new HashMap();
Collection values = map.values();
//(1) 增强for
for (Object value : values) {
System.out.println(value);
}
//(2) 迭代器
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
Object value = iterator2.next();
System.out.println(value);
}
第三种
通过EntrySet 来获取k-v。EntrySet指的是map.entrySet(),其中存放着Map.Entry。Map.Entry对象存放着一组key和value,可以通过getKey和getValue方法获取。
Map map = new HashMap();
Set entrySet = map.entrySet();//EntrySet<Map.Entry<K,V>>
//(1) 增强for
for (Object entry : entrySet) {
//将entry 转成Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
//(2) 迭代器
Iterator iterator3 = entrySet.iterator();
while (iterator3.hasNext()) {
Object entry = iterator3.next();
//System.out.println(next.getClass());//HashMap$Node -实现-> Map.Entry (getKey,getValue)
//向下转型Map.Entry
Map.Entry m = (Map.Entry) entry;
}
注意:
- Map内部存储键值对数据的基础单元其实是Node类型,Node对象作为构建哈希桶或维护链表等数据结构的基本元素。
- Entry类似于引用了Node的值,给外部提供了不可修改数据的查看方式。Map通常会提供键视图(keySet())、值视图(values())以及键值对视图(entrySet())等方法,这些视图中的元素都必须是不可变的,以防止外部程序对Map内部数据的直接修改。使用Entry作为视图中的元素类型,可以很好地达到这个目的。而Node作为内部可变数据存储结构,不适合直接对外暴露。
- Entry作为一个临时映射关系数据载体使用,而Node作为内部真正存储键值对数据的基本单元使用。这两个数据结构的分离设计使得Map内部实现和外部使用得以很好地解耦。