遍历Map集合
首先,我们知道在Collection(单列集合)中有两种遍历方式
- 其实在Collection中的List中我们有三种遍历方式
- 因为我们的List集合是有序的,所以我们就多了一种使用普通for循环遍历的方式,因为List集合是有序的,所以List集合中就设置了索引,这个时候我们就可以通过索引去遍历,就和数组一样,也就是使用普通for循环的方式
- 而我们的Collection集合中的Set集合中就只有三种遍历方式
- 因为我们的Set集合是无序的,所以就没有索引,也就没有使用普通for循环遍历的方式,也就是Set集合中只有两种遍历的方式,就是加强for循环的方式和使用iterator迭代器迭代的方式
所以也就是我们Collection集合遍历的方式共用的有两种
- 使用加强for循环的方式
- 使用iterator迭代器的方式
那么为什么使用可以使用加强for循环和使用Iterator迭代器的方式来遍历Collection集合?
- 我们来分析为什么可以使用加强for循环来遍历Collection集合?
- 因为我们的Collection接口继承了Iterable接口
- 实现了Iterable接口的类都可以使用加强for循环(也就是foreach循环进行遍历)
- 因为我们的Collection接口继承了Iterable接口
- 我们来分析为什么可以使用Iterator迭代器来遍历Collection集合?
- 因为我们的Iterator迭代器就是专门为了遍历Collection集合而创建出来的
- 也就是一个专业的Collection集合遍历器
- Iterator迭代器就是为了遍历Collection集合而创建的,所以我们当然可以使用迭代器来遍历Collection集合
- 因为我们的Iterator迭代器就是专门为了遍历Collection集合而创建出来的
那么我们的Map集合要如何来遍历?
- 这个时候我们首先要分析
- 我们没有一个专门遍历Map集合的工具类
- 我们的Map接口中也没有继承Iterable接口,这个时候我们的Map集合也就不能使用加强for循环遍历
- 但是我们又知道我们的Map集合中
- key可以使用Set集合进行存储的
- value可以使用Collection集合进行存储的
- key ---- value键值对(也就是Entry对象)可以使用Set集合进行存储
- 所以我们根据上面这三条性质,我们的Map类中就提供了一些方法,三个方法分别可以将我们的key存储到Set集合中并且将这个Set集合返回,将我们的value存储到Collection集合中并且将这个Collection集合返回,将我们的key — value键值对(也就是Entry对象)存储到Set集合中,然后将这个Set集合返回4
- 然后我们就得到了存储着key的Set集合,存储着value的Collection集合,以及存储着key ---- value键值对的Set集合,这个时候我们就可以使用遍历Set集合和遍历Collection集合的方式来间接的遍历Map集合
遍历Map集合中的key:
- KeySet();
- 返回调用这个方法的Map对象的key构成的Set集合
eg:
package com.ffyc.测试;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Demo1 {
public static void main(String[] args) {
HashMap h = new HashMap();
h.put(123,"aa");
h.put(124,"bb");
h.put(123,"cc");
h.put(1243,"aa");
Set set = h.keySet();
Iterator i = set.iterator();
while(i.hasNext()){
/*
由于我们上面的HashMap集合中的key都是Integer类型的数据,这个时候我们就可以放心的将我们的
next()方法的Object类型的返回值转型为Integer类型,这个时候我们可以直接转为int类型,这个其实就是
一种优化,我们这里的向下转型其实按理说两边都要是引用类型,但是由于我们向下转型为Integer类型之后
我们也可以直接自动拆箱为int类型,所以java官方就提供了这种优化,可以转为int类型
*/
int x = (int)i.next();
System.out.println(x);
}
}
}
遍历Map中的value
- values();
- 将我们的value存储到一个Collection集合中,并且将这个Collection集合返回
eg:
package com.ffyc.测试;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Collection;
public class Demo2 {
public static void main(String[] args) {
HashMap h = new HashMap();
h.put(123,"aa");
h.put(124,"bb");
h.put(123,"cc");
h.put(1243,"aa");
Collection collection = h.values();
Iterator i = collection.iterator();
while(i.hasNext()){
String x = (String)i.next();
System.out.println(x);
}
}
}
遍历Map中的Entry对象(也就是键值对)
- entrySet();
- 返回调用这个方法的Map对象中的Entry对象构成的Set集合
eg:
package com.ffyc.测试;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Map.Entry;
public class Demo3 {
public static void main(String[] args) {
HashMap h = new HashMap();
h.put(123,"aa");
h.put(124,"bb");
h.put(123,"cc");
h.put(1243,"aa");
Set set = h.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Entry entry = (Entry)i.next();
System.out.println(entry.getKey() + "------>" + entry.getValue());
}
}
}
- 这里我们使用了Map. Entry接口中的两个方法
- getKey();
- 获取这个Entry对象中的key值
- getValue();
- 获取这个Entry对象中的value值
- getKey();
补充:
如果我们只是想得到key和value的遍历,我们可以直接通过keySet()方法得到Key对应的Set集合,然后我们使用key,将这个key作为参数传递到get()方法中去就可以得到这个key对应的value了