Map接口及Map集合遍历方式
- Map和Collection没有继承关系
- Map集合以key和value的方式存储数据: 键值对
- key和value都是引用数据类型
- key和value都是存储对象的地址
- key起主导地位,value是key的一个附属品
- Map接口中的常用方法:
void clear() 清空Map集合
boolean containsKey(Object key) 判断Map集合中是否包含某个key
boolean containsValue(Object value) 判断Map中是否包含某个Value
V get(Object key) 通过key获取value
boolean isEmpty() 判断Map集合中元素个数是否为0
Set<K> keySet() 获取Map集合中所有的key(所有的键是一个set集合)
V remove(Object key) 通过key删除键值对
int size() 获取Map集合中键值对的个数
Collection<V> values()
Collection<V> values() 获取Map集合中所有的value,返回一个Collection
Set<Map,Entry<K,V>> entrySet() 将Map集合转换成Set集合
假设现在有一个Map集合,如下所示:
map1集合对象
key value
-----------------
1 zhangsan
2 lisi
3 wangwu
4 zhaoliu
Set set = map1.entrySet();
set集合对象
1=zhangsan
2=lisi
3=wangwu
4=zhaoliu ---》 这个东西是个什么?Map.Entry
[注意: Map集合通过entrySet()方法转换成的这个Set集合,Set集合中元素的类型是Map,Entry<K,V>]
[Map.Entry和String一样,都是一种类型的名字,只不过:Map.Entry是静态内部类,是Map中的静态内部类]
example:
// 创建Map集合对象
Map<Integer,String> map = new HashMap<>();
// 向Map集合中添加键值对
map.put(1,"zhangsan"); // 1 在这里实际上进行了自动装箱
map.put(2,"lisi");
map.put(3,"wangwu");
map.put(4,"zhaoliu");
// 通过key获取value
String value = map.get(2);
System.out.println(value);
// 获取键值对的数量
System.out.println("该map集合中键值对的数量为: "+map.size());
// 通过key删除key-value
map.remove(4); // 注意map无迭代器,故无法使用迭代器进行遍历
System.out.println("该map集合中键值对的数量为: "+map.size());
// 判断是否包含某个key
System.out.println(map.containsKey(4));
// 判断是否包含某个value
System.out.println(map.containsValue("lisi")); // contains方法底层都是调用的equals方法
// 清空集合map
map.clear();
System.out.println("键值对的数量为: "+map.size());
// 判断元素是否为空
System.out.println(map.isEmpty());
}
运行结果:
lisi
该map集合中键值对的数量为: 4
该map集合中键值对的数量为: 3
false
true
键值对的数量为: 0
true
- Map集合的遍历(非常重要)
note:因为Map集合并没有继承Iterator迭代器,故无法利用迭代器进行相关的遍历
- 方式一:获取所有的key,通过遍历key来遍历value
example1:迭代器(利用keySet()方法的返回值来调用迭代器)
Map<Integer,String> map = new HashMap<>();
map.put(1,"zhangsan");
map.put(2,"lisi");
map.put(3,"wangwu");
map.put(4,"zhaoliu");
// 遍历map集合
// 获取所有的key,所有的key是一个set集合(返回的是一个Set集合,而set集合则可以利用迭代器进行遍历)
Set<Integer> keys = map.keySet();
// 遍历key,通过key获取value
// 迭代器可以
Iterator<Integer> iterator = keys.iterator();
while(iterator.hasNext()){
// 取出其中一个key
Integer next = iterator.next();
// 通过key获取value
String s = map.get(next);
System.out.println(next+"="+s);
}
example2 : foreach循环
for (Integer key : keys){
System.out.println(key+""+map.get(key)); //此种方式效率更低是因为,先获取 了key,然后通过key取hash表里面找元素
}
- 方式二: Set<Map.Entry<K,V>> entrySet()
example1:迭代器
Set<Map.Entry<Integer, String>> set = map.entrySet();
// 遍历Set集合,每一次取出一个Node
Iterator<Map.Entry<Integer, String>> it = set.iterator();
while(it.hasNext()){
Map.Entry<Integer, String> next = it.next();
Integer key = next.getKey();
String value = next.getValue();
System.out.println(key+"="+value);
System.out.println(next);
}
example2: foreach循环
// 这种方式效率更高,因为把key和value放一堆了
for (Map.Entry<Integer, String> node:set){
//System.out.println(node.getKey()+"----->"+node.getValue());
System.out.println(node);
}
上诉所有代码运行结果均为:
1=zhangsan
2=lisi
3=wangwu
4=zhaoliu
补充:
关于map.entrySet()方法,它其实就是将map集合中的对象key,value转换成了为Set集合中的对象,并将key,value用等号进行了链接。具体的转换关系如图所示!