import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Main {
	/**
	 * Map
	 * 1.java.util包
	 * 2.接口 Map
	 * 3.映射顺序
	 *   某些映射实现可明确保证其顺序,如 TreeMap 类
	 *   另一些映射实现则不保证顺序    ,如 HashMap 类
	 * 4.key不能重复,但是只允许key有一个空值
	 * */
	public static void main(String[] args) {
		// 1.生成一个HashMap
		Map map1=new HashMap();
		
		// 2.添加元素,这个是无顺序的
		map1.put("吕布", "奉先");
		map1.put("赵云", "子龙");
		map1.put("典韦", "无字");
		map1.put("马超", "孟起");
		map1.put("关羽", "云长");
		map1.put("关羽", "二爷");    // 同名key,value会覆盖前面的值
		map1.put(null, "孔明");     // 可以有一个null值
		map1.put(null, "卧龙");
		map1.put("", "庞统");
		map1.put("", "凤雏");		
		System.out.println(map1);  // {关羽=二爷, null=卧龙, =凤雏, 吕布=奉先, 典韦=无字, 马超=孟起, 赵云=子龙}
		
		// 3.定义另一个map2,放到map1里面
		Map map2=new HashMap();
		map2.put("孙尚香","枭姬");
		map2.put("貂蝉", "闭月");
		map1.putAll(map2);
		System.out.println(map1); // {关羽=二爷, null=卧龙, =凤雏, 吕布=奉先, 典韦=无字, 貂蝉=闭月, 马超=孟起, 孙尚香=枭姬, 赵云=子龙}
		
		// 4.通过key获取value的值,get不到这个key就会返回空
		String str41=map2.get("貂蝉");
		System.out.println("str41 : "+str41);  // 闭月
		String str42=map2.get("西施");
		System.out.println("str42 : "+str42);  // null
		
		// 5.移除key
		String str5=map2.remove("貂蝉");
		System.out.println("str5 : "+str5);        // 闭月
		String str5_1=map2.get("貂蝉");
		System.out.println("str5_1 : "+str5_1);    // null
		System.out.println(map2);  // {孙尚香=枭姬}
		System.out.println(map1);  // {关羽=二爷, null=卧龙, =凤雏, 吕布=奉先, 典韦=无字, 貂蝉=闭月, 马超=孟起, 孙尚香=枭姬, 赵云=子龙}
		
		// 6.拿到map1中的所有key的集合
		// 循环通过key获取value
		Set set=map1.keySet();
		System.out.println(set);   // [关羽, null, , 吕布, 典韦, 貂蝉, 马超, 孙尚香, 赵云]
		for(String str:set) {
			String str6=map1.get(str);
			System.out.println("str6 : "+str6);
			//			str6 : 二爷
//			str6 : 卧龙
//			str6 : 凤雏
//			str6 : 奉先
//			str6 : 无字
//			str6 : 闭月
//			str6 : 孟起
//			str6 : 枭姬
//			str6 : 子龙
		}
		
		// 7.map1是否包含指定key,指定value,map是否是空的
		boolean b1=map1.containsKey("吕布");
		boolean b2=map1.containsValue("翼德");
		boolean b3=map1.isEmpty();
		System.out.println(b1);  // true
		System.out.println(b2);  // false
		System.out.println(b3);  // false
		
		// 8.另一种循环获取key value的方法
		// set8相当于Person类的对象,可以使用Person类的方法
		// en  相当于String类的对象,可以使用String类的方法
		Set> set8=map1.entrySet();
		for(Entry en:set8) {
			String key  =en.getKey();
			String value=en.getValue();
			System.out.println("key : "+key+", value : "+value);
//			  key : 关羽, value : 二爷
//			  key : null, value : 卧龙
//			  key : , value : 凤雏
//			  key : 吕布, value : 奉先
//			  key : 典韦, value : 无字
//			  key : 貂蝉, value : 闭月
//			  key : 马超, value : 孟起
//			  key : 孙尚香, value : 枭姬
//			  key : 赵云, value : 子龙
		}
	}
	
}