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集合遍历方式图解
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接口本身就是一个顶层接口。
转载于:https://blog.51cto.com/11841428/1864062