为了体现有对应关系的数据,我们之前所接触的数组,列表等集合用起来有点麻烦,这是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);
		}
	}

 

 

posted on 2018-07-31 20:15  七宝嘤嘤怪  阅读(163)  评论(0编辑  收藏  举报