文章目录
- 一, 集合概览
- 二, Map接口中的常用方法
- 2.1, Map接口中的基本方法:
- 2.2, Map接口中的获取方法:
- 三, 对Map的遍历
- 3.1, 利用keySet()根据键去找值
- 3.2, 利用entrySet()映射关系取出键和值
- 3.3, 利用values()直接取出map的值
- 四, HashMap 和 LinkedHashMap的辨析 ======4/12
一, 集合概览
- Map接口是一种双列集合.它的每一个元素都是一个键值对(Key-Value).键和值之间存在一种对应关系,称为映射.
- 从Map集合中访问元素时,只要指定了Key,就能找到对应的Value.
二, Map接口中的常用方法
2.1, Map接口中的基本方法:
补充:
- 调用 V remove(Object key)删除Map中元素时,在成功删除后会返回被删除键所对应的Key值. 若Map没有对应的Key值,则返回 null;
- 如果我们往Map中放入了相同键的键值对,这个键对应的值会发生更新噢!
代码示例:
package MapDemo;
import java.util.HashMap;
import java.util.Map;
public class BasicMapDemo {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<Integer,String>();
/// put添加元素
map.put(01,"cat");
map.put(02,"dog");
map.put(03,"chiken");
map.put(04,"dragon");
map.put(03,"sb");
System.out.println("put键值对后直接打印:"+ map);
///remove 移除元素
System.out.println(map.remove(05));
System.out.println(map.remove(03));
System.out.println(map);
//判断键或值的存在
System.out.println(map.containsKey(02));
System.out.println(map.containsValue("chiken"));
///判断集合的长度(键值对的个数)
System.out.println(map);
System.out.println(map.size());
//清空集合;
map.clear();
//判断集合是否为空
System.out.println(map.isEmpty());
}
}
输出结果:
2.2, Map接口中的获取方法:
补充:
Object get(Object key)----> 返回指定键所映射的值.如果没有此键 则返回null;
- V map.getOrDefault( key, val); ===> 此方法意思是获取到map中对应key的值, 如果不存在, 则把这个key的值设置为val; ===> 在滑动窗口的典型例题(lt. 76 最小覆盖子串)中用到了这个方法;
代码示例:
package MapDemo;
import java.util.*;
public class AccessMapDemo {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<Integer,String>();
/// put添加元素
map.put(01,"cat");
map.put(02,"dog");
map.put(03,"chiken");
map.put(04,"dragon");
map.put(03,"sb");
System.out.println("put键值对后直接打印:"+ map);
///根据键获取值,键不存在,则返回null
System.out.println(map.get(03));
System.out.println(map.get(05));
//获取所有键的集合 map.keySet()
/// ctrl + shift +V 自动生成=左边的部分(即数据类型 变量名)
Set<Integer> key = map.keySet();
for(int i : key){
System.out.println(i);
}
//获取所有值的集合 map.values()
/// ctrl + shift +V 自动生成=左边的部分(即数据类型 变量名)
Collection<String> values = map.values();
Iterator<String> it = values.iterator();
while(it.hasNext()){
System.out.println(it.next());4/
}
}
}
三, 对Map的遍历
3.1, 利用keySet()根据键去找值
3.2, 利用entrySet()映射关系取出键和值
3.3, 利用values()直接取出map的值
在Map中,还提供了一个
values()
方法,通过这个方法可以直接获取Map中存储所有值的一个Collection集合.
三种遍历的代码示例:
package MapDemo;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
public class MapTraverseDemo {
public static void main(String[] args) {
Map<String,String> hashMap = new HashMap<String,String>();
hashMap.put("2","Iron man");
hashMap.put("1","Spider man");
hashMap.put("4","Keyboard man");
hashMap.put("3","Green-Hat man");
System.out.println(hashMap);
Map的两种遍历方式;
///1.先遍历Map集合中所有的键,再根据键获取对应的值;
先遍历Map集合所有的键,用keySet()实现;
Set<String> keySet = hashMap.keySet();
///把键放在Set集合中并使用增强for循环读取;
for(String keySet : keySet){
//每读出一个键,就去使用get(Object key)获取值;
System.out.println(keySet+":"+hashMap.get(keySet));
}
///2. 根据entryKey()获得映射关系并取出键和值;
//利用entryKey()得到键值映射关系
Set<Map.Entry<String,String>> entrySet = hashMap.entrySet();
for(Map.Entry<String,String> entry : entrySet){
///遍历映射关系取出键和值.
System.out.println(entry.getKey()+":"+entry.getValue());
}
///3, 利用 values()获得Map中的值
Collection<String> values = hashMap.values();
Iterator<String> iterator = values.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
- 输出结果:
对第二种遍历方式的补充说明:
- 在第二种遍历方式中,我们首先调用Map对象的entrySet()方法获得存储在Map中的键值映射的一个Set集合,
这个Set集合中存放了 Map.Entry类型的元素(Entry是Map的接口内部类),每个Map.Entry对象代表Map中的一个键值对
. - 然后我们迭代Set集合,获得每一个映射对象,并分别调用映射对象的 getKey() 和 getValues()方法获取键和值.
四, HashMap 和 LinkedHashMap的辨析 ======4/12
结论:
- 从 cp3中对HashMap的遍历可知,HashMap集合在遍历时会根据key值对键值对进行排序. 所以HashMap集合迭代出元素的顺序和存入的顺序是不一致的,要想让存和取的顺序一致,我们可以使用 LinkedHashMap.
- LinkedHashMap是HashMap 的子类,它与LinkedList一样也使用双向链表去维护内部元素的关系,从而使得Map元素迭代的顺序与存入的顺序一致;
代码示例:
package MapDemo;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class LinkedHashMapDemo {
public static void main(String[] args) {
Map<Integer,String> LHMap = new LinkedHashMap<Integer,String>();
LHMap.put(2,"Iron man");
LHMap.put(1,"Spider man");
LHMap.put(4,"Keyboard man");
LHMap.put(3,"Green-Hat man");
//1. keySet()
Set<Integer> keySet = LHMap.keySet();
for(Integer key : keySet){
System.out.println(key+":"+LHMap.get(key));
}
System.out.println("======================================");
///2.entrySet()
Set<Map.Entry<Integer,String>> entrySet = LHMap.entrySet();
for(Map.Entry<Integer,String> entry : entrySet){
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
输出结果:
由此可见, LinkedHashMap是有序的(存取的次序是一致的);
拓展: 集合中元素的比较和转换深入:重要集合接口的源码剖析