1、Map应用背景:
* 有如下需求:学生和学号一一对应
* 学号1: 学生1
* 学号2: 学生2
* 学号3: 学生3
*
* 我们可以通过二维数组,或者两个List系列的集合来表达。
* 但是这样的话,我们就创建了多个容器
* 怎么办?java就提供了一种新的集合MAP
* Map:最大的优点就是体现对应关系。
* Map是一个键值对形式的集合,它的数据不在是单个的了,必须同时有键和值组合。
*
* Map和Collection的区别
* Map:是键值对形式的集合,称为双列形式的集合。键必须是唯一的,不可以重复,值可以重复。看成是夫妻的集合。
*
* Collection:是单列形式的集合。Collection的List儿子可以重复,它的Set儿子是唯一的。看成是单身汉的集合。
2、 Map接口的功能
* A:添加功能
* V put(K key, V value);当key在集合中不存在时添加元素。当Key在集合中存在时,替换元素
* 并返回替换的值,如果之前没有,返回的是null。
* B:删除功能
* void clear();清除所有键值对
* V remove(Object key);根据指定的键删除键值对
* C:判断功能
* boolean containsKey(Object key);判断指定的键是否在集合中出现
* boolean containsValue(Object value);判断指定的值是否在集合中出现
* boolean isEmpty();判断集合是否为空
* D:获取功能
* Set<Map.Entry<K,V>> entrySet();返回此映射中包含的映射关系的set视图。
* Set<K> keySet();返回的是所有键的集合
* V get(Object key);根据键获取值
* Collection<V> values();所有值的集合,返回此映射中包含的值的Collection视图
* E:长度功能
* int size();返回此映射中的键值映射关系
*
* 注意Map集合中的具体实现类的数据结构,是针对键有效。
3、 Map集合的遍历:
* Set<K> keySet();返回的是所有键的集合
* Collection<K> values()
* V get(Object key);根据键获取值
*
* 通过keySet();拿所有的键,通过get(Object key)拿所有的值
Map集合的遍历。
* 方式一:丈夫找妻子
* A:把所有丈夫集合起来,Set<K> keySet()
* B:遍历丈夫集合,获取每一个丈夫,迭代器,增强for
* C:让丈夫找妻子get(Object key)
* A:获取所有结婚证的集合Set<结婚证> entrySet();返回此映射中包含的映射关系的set视图。
* class 结婚证<K,V>
* {
* private K key;
* private V value;
*
* public 结婚证(K key,V value)
* {
* this.key = key;
* this.value = value;
* }
* public K getKey()
* {
* return key;
* }
* public V getValue()
* {
* return value;
* }
* }
* B:遍历结婚证集合,获取到每一个结婚证对象,迭代器,增强for。
* C:通过结婚证对象获取丈夫和妻子。
getKey()
getValue()
Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是一个接口,静态内部接口,他的用途是表示一个映射项(里面有Key和Value),而Set<Map.Entry<K,V>>表示一个映射项的Set。Map.Entry里有相应的getKey和getValue方法,让我们能够从一个项中取出Key和Value。
4、HashMap集合存储并遍历:
1)String
2)Student
3)特殊需求:
HashMap保证唯一性需要重写Student中HashCode方法和equals方法。
5、TreeMap:
1)TreeMap存储String类型的键和值,将键按照自然顺序排列:
2)如果键是Student类:
TreeMap存储自定义对象并遍历
* 键:Student
* 值:String
这样会报错,cn.itcast_02.Student cannot be cast to java.lang.Comparable
* 如果一个自定义对象做键,用TreeMap集合那必须实现排序
* 两种方式:
* A:让自定义对象所属的类去实现Comparable接口
* B:使用带参构造方法,创建TreeMap,接收Comparator接口参数。
* a:造个类去实现Comparator接口
* b:匿名内部类。
因为第二种比较好,我们直接使用第二种,且采用匿名内部类的方法:
6、HashMap和Hashtable的区别:
A:HashMap 线程安全,效率低,允许null键和值
B:Hashtable线程不安全,效率高,不允许null键和值
7、 Map集合的嵌套
czbk:
* yr 预热班
* 01 zhangsan
* 02 lisi
*
* jy 就业班
* 01 wangwu
* 02 zhaoliu