为了体现有对应关系的数据,我们之前所接触的数组,列表等集合用起来有点麻烦,这是Java又为我们提供了一种专门存储对应关系的集合Map。
Map:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。这是API中对Map的描述。
Map与Collection的区别在于,Map是一个双列集合,处理一个键为key,值为value的键值对,其中key不可以重复;而Collection是一个单列集合,它有不同的子体系,有允许重复的,也有不允许的;有的有序,有的无序。
一、Map的常用功能
我们以学生学号与姓名这组键值对来示例代码
- 添加修改功能 V put(K key, V value);
将Map中键为key的值修改为value,如果key不存在,在map中添加新的键值对,如果key存在,将键值对的值修改为value,并返回原来键值对的值。
private static void method() {
//创建Map对象
Map<String, String> map = new HashMap<String, String>();
System.out.println(map.put("20153608", "张三"));
//output:null
System.out.println(map);
//output:{20153608=张三};说明元素已经添加成功
System.out.println(map.put("20153609", "李四"));
//output:null
System.out.println(map.put("20153609", "王五"));
//output:李四;学号"20153609"已经存在,对Key学号对应的值Value进行修改 ,并返回原来的值
System.out.println(map);
//output:{20153609=王五, 20153608=张三}
}
- 获取功能 V get(Object key); int size();
get方法根据Key返回对应的Value;size方法返回对应关系的个数,即map中有几对对应关系。
private static void method4() {
// 创建Map对象
Map<String, String> map = new HashMap<String, String>();
map.put("20153608", "张三");
map.put("20153609", "李四");
map.put("20153610", "王五");
System.out.println(map.size());
//output:3
System.out.println(map.get("20153609"));
//output:李四
}
- 判断功能 boolean isEmpty(); boolean containsKey(Object key); boolean containsValue(Object value);
分别判断Map是否有键值对; 是否包含键Key; 是否包含值Value
private static void method2() {
// 创建Map对象
Map<String, String> map = new HashMap<String, String>();
System.out.println(map.isEmpty());
// output:true
map.put("20153608", "张三");
map.put("20153609", "李四");
System.out.println(map.isEmpty());
// output:false
System.out.println(map.containsKey("20153608"));
// output:true
System.out.println(map.containsValue("李四"));
// output:true
}
- 删除功能 void clear(); V remove(Object key);
clear() 清空所有的对应关系; remove方法删除指定key的对应关系,删除成功返回key对应的值,否则返回null。
private static void method3() {
// 创建Map对象
Map<String, String> map = new HashMap<String, String>();
map.put("20153608", "张三");
map.put("20153609", "李四");
map.put("20153610", "王五");
System.out.println(map);
// output:{20153610=王五, 20153609=李四, 20153608=张三}
System.out.println(map.remove("20153610"));
// output:王五
System.out.println(map.remove("11111111"));
// output:null
map.clear();
System.out.println(map);
// output:{}
}
- 遍历功能 Set<Map.Entry<K, V>> entrySet();
entrySet方法返回一个Set,这个Set存储着Map的一个内部类Entry,Entry有两个泛型。
之后遍历时我们会用到这个方法。
- 特异功能 Set<K> keySet(); Collection<V> values();
keySet方法获取所有键Key,返回Set集合;values方法获取所有值Value,返回Collection集合;
为何keySet返回一个Set类型呢?因为Map的Key是唯一不允许重复的,Set的特点正是不允许重复。
为何values方法返回Collection?因为Map的Value是允许重复的,如果返回Set,重复的value就没了。查看源码会发现values方法返回的是一个Values的内部类,这个类直接实现了AbstractCollection接口,因此不能强转成List。
private static void method5() {
// 创建Map对象
Map<String, String> map = new HashMap<String, String>();
map.put("20153608", "张三");
map.put("20153609", "李四");
map.put("20153610", "王五");
Set<String> keys = map.keySet();
for (String key : keys)
System.out.print(key + " ");
//output:20153610 20153609 20153608
System.out.println();
Collection<String> values = map.values();
for (String value : values)
System.out.print(value + " ");
//output:王五 李四 张三
}
二、Map的遍历方式
- 第一种方式
首先使用Set<K> keySet()获取所有的key,然后循环遍历的同时使用Map的get(Object key)方法得到key对应的值。
private static void method6() {
// 创建Map对象
Map<String, String> map = new HashMap<String, String>();
map.put("20153608", "张三");
map.put("20153609", "李四");
map.put("20153610", "王五");
//获取所有的Key
Set<String> keys = map.keySet();
//使用map.get(key)方法获取对应的值
for(String key : keys)
System.out.println(key+":"+map.get(key));
}
- 第二种方式
更加面向对象的一种遍历方式。entrySet方法返回一个Set,这个Set存储着Map的一个内部类Entry,Entry有两个泛型。遍历时通过调用Entry.getKey()和Entry.getValue()来输出。
private static void method7() {
// 创建Map对象
Map<String, String> map = new HashMap<String, String>();
map.put("20153608", "张三");
map.put("20153609", "李四");
map.put("20153610", "王五");
//获取一个内部类Entry对象的集合
Set<Map.Entry<String, String>> entrys = map.entrySet();
//获得Entry的每一个对象,使用getKey(),getValue()获得每一组键值对
for(Map.Entry<String, String> entry : entrys){
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+" "+value);
}
}