1.Map集合的概述

  Map集合是将键映射到值的对象。一个映射不能包含重复的键。每个键最多只能映射到一个值。


2.Map接口和Collection接口的不同?

  Map集合存储元素是成对出现的,Collection集合存储元素是单独出现的。

  Map集合的键是唯一的,值是可重复的。

  Collection集合的子接口Set是唯一的,List是可重复的。

  Map集合的数据结构值针对键有效,和值无关,而Collection接口的数据结构是针对元素有效。


3.Map集合示例及功能

package cn;

import java.util.HashMap;
import java.util.Map;

/**
 *  作为学生来说,是根据学生学号来区分不同的学生的。
 *  那么假设我现在已经知道了学生的学号,我要根据学号去获取学生的姓名,怎么办?
 *  
 *  如果采用前面讲解过的集合,我们只能把学号和学生姓名作为一个对象的成员,
 *  然后存储整个对象,将来遍历的时候,判断,获取对应的名称。
 *  
 *  但是如果我都知道能把学生姓名拿出来,我还需要根据编号去查找吗?
 *  针对我们目前的这种需求:仅仅知道学号,就想知道学生姓名的情况,java就提供了一种新的集合--Map集合。
 *  
 *  Map集合的功能概述:
 *  添加功能
 *      public V put(K key,V value):添加元素 
 *      如果键是第一次存储,救命直接存储元素,返回null,如果键不是第一次存储,就用值把以前的值覆盖掉,返回以前的值。
 *  删除功能
 *     	public void clear() 清空所有的键值元素
 *      public V remove(Object key) 根据键删除键值对元素,并把值返回
 *  判断功能
 *      public boolean containsKey(Object key):判断集合中是否包含指定的键
 *      public boolean containsValue(Object value):判断集合中是否包含指定的值
 *      public boolean isEmpty() 判断集合是否为空
 *  获取功能
 *      Set<Map.Entry<K,V>> entrySet()
 *      public V get(Object key) 根据键获取值
 *      Set<E> keySet() 获取集合中所有键的集合
 *      Collection<V>() values 获取集合中所有的值的集合
 *  长度功能
 *  	public int size() 返回集合中键值对的个数
 */
public class MapDemo {
	public static void main(String[] args) {
		//创建Map集合
		Map<String, String> map = new HashMap<String, String>();
		
		//添加元素
		System.out.println(map.put("文章", "马伊琍"));
		System.out.println(map.put("文章", "姚笛"));
		
		map.put("邓超", "孙俪");
		map.put("黄晓明", "杨颖");
		map.put("周杰伦", "昆凌");
		map.put("刘恺威", "杨幂");
		
		System.out.println(map);
		
		System.out.println("remove:"+map.remove("黄晓明"));
		System.out.println(map);
		
		System.out.println(map.containsKey("周杰伦"));
		
		System.out.println(map.isEmpty());
		
		System.out.println(map.size());
		
	}

}

null

马伊琍

{邓超=孙俪, 文章=姚笛, 周杰伦=昆凌, 黄晓明=杨颖, 刘恺威=杨幂}

remove:杨颖

{邓超=孙俪, 文章=姚笛, 周杰伦=昆凌, 刘恺威=杨幂}

true

false

4


4.Map集合的获取功能

package cn;

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

/**
 * Map集合的获取功能
 *
 */
public class MapDemo2 {
	public static void main(String[] args) {
		//创建集合对象
		Map<String, String> map = new HashMap<String, String>();
		
		//添加元素
		map.put("邓超", "孙俪");
		map.put("黄晓明", "杨颖");
		map.put("周杰伦", "昆凌");
		map.put("刘恺威", "杨幂");
		
		//public V get(Object key) 根据键获取值
		System.out.println(map.get("黄晓明"));//杨颖
		
		//Set<E> keySet() 返回所有键的集合
		Set<String> set = map.keySet();
		for(String str :set){
			System.out.println(str);
		}
		/**
		 * 邓超
		 * 周杰伦
		 * 黄晓明
		 * 刘恺威
		 */
		
		//Collection<V> values() 返回值的集合
		Collection<String> v = map.values();
		for(String str :v){
			System.out.println(str);
		}
		/**
		 * 孙俪
		 * 昆凌
	         * 杨颖
		 * 杨幂
		 */
		
		
	}

}


5.Map集合的遍历方式一

package cn;

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

/**
 * Map集合的遍历
 *
 */
public class MapDemo3 {
	public static void main(String[] args) {
		//创建集合对象
		Map<String, String> map = new HashMap<String, String>();
				
		//添加元素
		map.put("邓超", "孙俪");
		map.put("黄晓明", "杨颖");
		map.put("周杰伦", "昆凌");
		map.put("刘恺威", "杨幂");
		
		//遍历集合
		Set<String> set = map.keySet();
		for(String str:set){
			System.out.println(str+":"+map.get(str));
		}
		
	}
}

邓超:孙俪

周杰伦:昆凌

黄晓明:杨颖

刘恺威:杨幂


6.Map集合遍历方式二

package cn;
/**
 * Map集合遍历
 */
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo4 {
	public static void main(String[] args) {
		//创建集合对象
		Map<String, String> map = new HashMap<String, String>();
						
		//添加元素
		map.put("邓超", "孙俪");
		map.put("黄晓明", "杨颖");
		map.put("周杰伦", "昆凌");
		map.put("刘恺威", "杨幂");
		
		Set<Map.Entry<String, String>> entrySet = map.entrySet();
		
		for(Map.Entry<String, String> me : entrySet){
			String key = me.getKey();
			String value = me.getValue();
			System.out.println(key+":"+value);
		}
		
		
	}
}

邓超:孙俪

周杰伦:昆凌

黄晓明:杨颖

刘恺威:杨幂


7.Map集合遍历

方式1:根据键找值

  获取所有键的集合

  遍历键的集合,获取到每一个键

  根据键找到值

package cn;

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

/**
 * Map集合的遍历
 *
 */
public class MapDemo3 {
	public static void main(String[] args) {
		//创建集合对象
		Map<String, String> map = new HashMap<String, String>();
				
		//添加元素
		map.put("邓超", "孙俪");
		map.put("黄晓明", "杨颖");
		map.put("周杰伦", "昆凌");
		map.put("刘恺威", "杨幂");
		
		//遍历集合
		Set<String> set = map.keySet();
		for(String str:set){
			System.out.println(str+":"+map.get(str));
		}
		
	}
}

方式2:根据键值对对象找键和值

package cn;
/**
 * Map集合遍历
 */
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapDemo4 {
	public static void main(String[] args) {
		//创建集合对象
		Map<String, String> map = new HashMap<String, String>();
						
		//添加元素
		map.put("邓超", "孙俪");
		map.put("黄晓明", "杨颖");
		map.put("周杰伦", "昆凌");
		map.put("刘恺威", "杨幂");
		
		Set<Map.Entry<String, String>> entrySet = map.entrySet();
		for(Map.Entry<String, String> me :entrySet){
			String key = me.getKey();
			String value = me.getValue();
			System.out.println(key+":"+value);
		}
		
		System.out.println("-------------------------------");
		
		for(Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();iterator.hasNext();){
			Map.Entry<String, String> mapValue = iterator.next();
			String key = mapValue.getKey();
			String value = mapValue.getValue();
			System.out.println(key+":"+value);
		}
		
	}
}

邓超:孙俪

周杰伦:昆凌

黄晓明:杨颖

刘恺威:杨幂

-------------------------------

邓超:孙俪

周杰伦:昆凌

黄晓明:杨颖

刘恺威:杨幂


8.Map集合遍历方式图解

wKiom1gIvd6hER3BAABPP5Khzsw008.png


9.Map集合练习

package cn;

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

/**
 * HashMap:是基于哈希表的Map接口实现。
 * 哈希表的作用是保证键的唯一性。 
 *
 */
public class HashMapDemo {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		
		map.put("it001", "马云");
		map.put("it002", "马化腾");
		map.put("it003", "乔布斯");
		map.put("it004", "张朝阳");
		map.put("it005", "雷军");
		
		Set<String> set = map.keySet();
		for(String str:set){
			System.out.println(str+":"+map.get(str));
		}
		System.out.println("------------------");
		
		Set<Map.Entry<String, String>> s = map.entrySet();
		for(Map.Entry<String, String> me :s){
			System.out.println(me.getKey()+":"+me.getValue());
		}
		System.out.println("-----------------");
		
		for(Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();iterator.hasNext();){
			Map.Entry<String, String> m = iterator.next();
			System.out.println(m.getKey()+":"+m.getValue());
		}
		
		
	}
}

it004:张朝阳

it003:乔布斯

it005:雷军

it002:马化腾

it001:马云

------------------

it004:张朝阳

it003:乔布斯

it005:雷军

it002:马化腾

it001:马云

-----------------

it004:张朝阳

it003:乔布斯

it005:雷军

it002:马化腾

it001:马云


10.LinkedHashMap类概述

Map接口的哈希表和链表实现,具有可预知的迭代顺序。

package cn;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class LinkedHashMapDemo {
	public static void main(String[] args) {
		Map<String, String> map = new LinkedHashMap<String, String>();
		map.put("it001", "马云");
		map.put("it002", "马化腾");
		map.put("it004", "张朝阳");
		map.put("it003", "乔布斯");
		map.put("it005", "雷军");
		
		Set<String> set = map.keySet();
		for(String str :set){
			System.out.println(str+":"+map.get(str));
		}
		
		System.out.println("-----------------");
		
		Set<Map.Entry<String, String>> mapValue = map.entrySet();
		for(Map.Entry<String, String> me : mapValue){
			String key = me.getKey();
			String value = me.getValue();
			System.out.println(key+":"+value);
		}
		
		System.out.println("-------------------");
		
		for(Iterator<Map.Entry<String, String >> iterator = map.entrySet().iterator();iterator.hasNext();){
			Map.Entry<String, String> m = iterator.next();
			String key = m.getKey();
			String value = m.getValue();
			System.out.println(key+":"+value);
		}
		
	}

}

it001:马云

it002:马化腾

it004:张朝阳

it003:乔布斯

it005:雷军

-----------------

it001:马云

it002:马化腾

it004:张朝阳

it003:乔布斯

it005:雷军

-------------------

it001:马云

it002:马化腾

it004:张朝阳

it003:乔布斯

it005:雷军


11.TreeMap

package cn;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * TreeMap
 */
public class TreeMapDemo {
	public static void main(String[] args) {
		Map<String, String> map = new TreeMap<String, String>();
		
		map.put("it001", "马云");
		map.put("it003", "乔布斯");
		map.put("it004", "张朝阳");
		map.put("it002", "马化腾");
		map.put("it005", "雷军");
		
		//遍历方法一
		Set<String> set = map.keySet();
		for(String str:set){
			System.out.println(str+":"+map.get(str));
		}
		
		System.out.println("---------------");
		
		//遍历方法二
		Set<Map.Entry<String, String>> s = map.entrySet();
		for(Map.Entry<String, String> me:s){
			System.out.println(me.getKey()+":"+me.getValue());
		}
		System.out.println("---------------");
		
		//遍历方法三
		for(Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();iterator.hasNext();){
			Map.Entry<String, String> me = iterator.next();
			String key = me.getKey();
			String value = me.getValue();
			System.out.println(key+":"+value);
		}
		
	}
}

it001:马云

it002:马化腾

it003:乔布斯

it004:张朝阳

it005:雷军

---------------

it001:马云

it002:马化腾

it003:乔布斯

it004:张朝阳

it005:雷军

---------------

it001:马云

it002:马化腾

it003:乔布斯

it004:张朝阳

it005:雷军

package cn;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

public class TreeMapDemo2 {
	public static void main(String[] args) {
		Map<Student, String> map = new TreeMap<Student, String>(new Comparator<Student>(){
			@Override
			public int compare(Student o1, Student o2) {
				return o1.getAge() - o2.getAge();
			}
			
		});
		
		Student s1 = new Student("哈哈",24);
		Student s2 = new Student("呵呵",20);
		Student s3 = new Student("嘻嘻",48);
		Student s4 = new Student("笨笨",23);
		
		map.put(s1, "唐");
		map.put(s2, "宋");
		map.put(s3, "明");
		map.put(s4, "清");
		
		
		for(Iterator<Map.Entry<Student, String>> iterator = map.entrySet().iterator();iterator.hasNext();){
			Map.Entry<Student, String> me = iterator.next();
			Student stu = me.getKey();
			String value = me.getValue();
			System.out.println(stu+":"+value);
		}
	}

}

Student [name=呵呵, age=20]:宋

Student [name=笨笨, age=23]:清

Student [name=哈哈, age=24]:唐

Student [name=嘻嘻, age=48]:明


12."aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)

package cn;

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * "aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
 * 分析:
 * 		1.定义一个字符串
 * 		2.定义一个TreeMap集合
 * 			键:Character
 * 			值:Integer
 * 、	3.把字符串转换为字符数组
 * 		4.遍历字符数组,得到每一个字符
 * 		5.拿刚才得到的字符作为键到集合中去找,看返回值
 * 			是null:说明该键不存在,就把该字符作为键,1作为值存储
 * 			不是Null:说明该键存在,就把值+1,重新存储该键和值
 */
public class TreeMapTest {
	public static void main(String[] args) {
		String str = "aababcabcdabcde";
		
		char[] chs = str.toCharArray();
		
		Map<Character, Integer> map = new TreeMap<Character, Integer>();
		
		for(char ch:chs){
			Integer i = map.get(ch);
			if(null == i){
				map.put(ch, 1);
			}else{
				i++;
				map.put(ch, i);
			}
		}
		
		StringBuilder sb = new StringBuilder();
		Set<Character> set = map.keySet();
		for (Character character : set) {
			Integer value = map.get(character);
			sb.append(character).append("(").append(value).append(")");
		}
		
		System.out.println(sb.toString());
		
	}
}

a(5)b(4)c(3)d(2)e(1)


13.存储班级、学生名字和年龄,并遍历

package com;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 一个学校都有许多年级,一个年级有许多班级,而一个班级有许多学生,学生有学生名字和年龄。
 * 学校
 * 		高三	
 * 			高三02班
 * 					如来叔叔	40
 * 					玉帝哥哥	35
 * 			高三03班
 * 					嫦娥姐姐	25
 *    				八戒弟弟	29	
 * 		高二
 * 			高二02班
 * 					悟空哥哥	26
 * 					观音姐姐	30
 * 			高二03班
 * 					蜘蛛精姐姐       36
 *					女儿国国王	35 					
 */
public class HashMapDemo {
	public static void main(String[] args) {
		//创建年级集合
		Map<String, Map<String, Map<String, Integer>>> map = new HashMap<String, Map<String,Map<String,Integer>>>();
		
		//高三02班
		Map<String, Integer> classGaoSan02 = new HashMap<String, Integer>();
		
		//如来叔叔	40
		classGaoSan02.put("如来叔叔", 40);
		//玉帝哥哥	35
		classGaoSan02.put("玉帝哥哥", 35);
		
		//高三02班
		Map<String, Integer> classGaoSan03 = new HashMap<String, Integer>();
		
		//嫦娥姐姐	25
		classGaoSan03.put("嫦娥姐姐", 25);
		
		//八戒弟弟  29
		classGaoSan03.put("八戒弟弟", 29);
		
		
		//高二02班
		Map<String, Integer> classGaoEr02 = new HashMap<String, Integer>();
		
		//悟空哥哥  26
		classGaoEr02.put("悟空哥哥", 26);
		
		//观音姐姐	30
		classGaoEr02.put("观音姐姐", 30);
		
		Map<String,Integer> classGaoEr03 = new HashMap<String, Integer>();
		
		//蜘蛛精姐姐       36
		classGaoEr03.put("蜘蛛精姐姐", 36);
		
		//女儿国国王       35
		classGaoEr03.put("女儿国国王", 35);
		
		//高二年级
		Map<String, Map<String, Integer>> grand02 = new HashMap<String, Map<String,Integer>>();
		
		//添加班级
		grand02.put("高二02班", classGaoEr02);
		grand02.put("高二03班", classGaoEr03);
		
		//高三年级
		Map<String, Map<String, Integer>> grand03 = new HashMap<String, Map<String,Integer>>();
		grand03.put("高三02班", classGaoSan02);
		grand03.put("高三03班", classGaoSan03);
		
		//添加班级
		map.put("高二",grand02);
		map.put("高三", grand03);
		
		
		//遍历集合
		for(Iterator<Map.Entry<String, Map<String, Map<String, Integer>>>> iter =map.entrySet().iterator();iter.hasNext();){
			Map.Entry<String,Map<String,Map<String, Integer>>> m = iter.next();
			String grandName = m.getKey();
			System.out.println(grandName);
			Map<String, Map<String, Integer>> grand = m.getValue();
			for(Iterator<Map.Entry<String, Map<String, Integer>>> ite = grand.entrySet().iterator();ite.hasNext();){
				Map.Entry<String, Map<String, Integer>> mc = ite.next();
				String className = mc.getKey();
				System.out.println(className);
				Map<String, Integer> clazz = mc.getValue();
				for(Iterator<Map.Entry<String, Integer>> iterator = clazz.entrySet().iterator();iterator.hasNext();){
					Map.Entry<String, Integer> me = iterator.next();
					String name = me.getKey();
					Integer age = me.getValue();
					System.out.println(name+":"+age);
					
				}
			}
				
		}
			
	}
}

高三

高三03班

嫦娥姐姐:25

八戒弟弟:29

高三02班

玉帝哥哥:35

如来叔叔:40

高二

高二02班

观音姐姐:30

悟空哥哥:26

高二03班

蜘蛛精姐姐:36

女儿国国王:35


14.练习

package com;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 需求:
 * 		假设HashMap集合的元素是ArrayList,有3个。
 * 		每一个ArrayList集合元素的值是字符串。
 * 		如下所示:
 * 			三国演义	
 * 				吕布
 * 				周瑜
 * 			笑傲江湖
 * 				令狐冲
 * 				林平之
 * 			神雕侠侣
 * 				小龙女
 * 				杨过
 */
public class HashMapDemo2 {
	public static void main(String[] args) {
		//创建集合对象
		Map<String,ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
		
		//创建三国演义
		ArrayList<String> sanGuo = new ArrayList<String>();
		sanGuo.add("吕布");
		sanGuo.add("周瑜");
		
		//创建笑傲江湖
		ArrayList<String> xiaoAo = new ArrayList<String>();
		xiaoAo.add("令狐冲");
		xiaoAo.add("林平之");
		
		//创建神雕侠侣
		ArrayList<String> shenDiao = new ArrayList<String>();
		shenDiao.add("小龙女");
		shenDiao.add("杨过");
		
		//将三本书添加到集合之中
		map.put("三国演义", sanGuo);
		map.put("笑傲江湖", xiaoAo);
		map.put("神雕侠侣", shenDiao);
		
		//遍历元素
		for(Iterator<Map.Entry<String, ArrayList<String>>> iter = map.entrySet().iterator();iter.hasNext();){
			Map.Entry<String, ArrayList<String>> me = iter.next();
			String name = me.getKey();
			System.out.println(name);
			ArrayList<String> strs = me.getValue();
			for(String str : strs){
				System.out.println(str);
			}
			System.out.println();
		}
	}

}

神雕侠侣

小龙女

杨过


三国演义

吕布

周瑜


笑傲江湖

令狐冲

林平之


15.Hashtable和HashMap的区别?

Hashtable:线程安全,效率低。不允许null键和null值。

HashMap:线程不安全,效率高。允许null键和null值。


16.List、Set、Map接口的区别?

List、Set接口不是继承自Map接口,它们继承自Collection接口。

Map接口本身就是一个顶层接口。