黑马程序员技术交流社区

标题: Map集合小结(求打赏各种...) [打印本页]

作者: 路途    时间: 2015-7-6 18:54
标题: Map集合小结(求打赏各种...)
本帖最后由 路途 于 2015-7-6 19:25 编辑

一.概述
1.Map集合在Java集合类的关系如下图所示

2.Map集合的定义及其方法摘要
Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。即一个映射不能包含重复的键;每个键最多只能映射到一个值。
Collection:单列集合;Map是双列集合。
Map 接口提供三种collection 视图,允许以
键集(KeySet)、值集(values)或键-值映射关系集(entrySet)的形式查看某个映射的内容。映射顺序定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。
方法摘要:
1.添加:put(K key,V value):如果添加时出现相同的键,那么新的值会替换掉旧的值,并且put方法会
返回被覆盖的值
putAll(Map<? extends K,? extends V> m) :从指定映射中将所有映射关系复制到此映射中(可选操作)。
2.删除:clear():从此映射中移除所有映射关系(可选操作)。
remove(Objcet key):如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
3.判断:containsKey(Object key):如果此映射包含指定键的映射关系,则返回 true。
containsValue(Object value) :如果此映射将一个或多个键映射到指定值,则返回 true。
equals(Object o):比较指定的对象与此映射是否相等。
isEmpty():如果此映射未包含键-值映射关系,则返回 true。
4.获取:get(Object key):返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回
size():返回此映射中的键值关系数。
entrySet():返回此映射中包含的映射关系的 Set 视图。
keySet():返回此映射中包含的键的 Set 视图。
values():返回此映射中包含的值的 Collection 视图。

二.Map集合的注意点
1.Hashtable,HashMap,TreeMap的区别
Hashtable:此类实现一个哈希表,该哈希表将键映射到相应的值。
任何非 null 对象都可以用作键或值。(该集合线程不同步)
HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null键。(
除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
TreeMap:底层是二叉树结构,线程不同步,且具有顺序(对
进行了排序)。
Set底层就是使用了Map集合。

2.Map 集合的两种获取方式
(1)KeySet:将map中所有的键存入到Set集合。因为set具备迭代器。 所有可以迭代方式取出所有的键,再根据map的get方法。获取每一个键对应的值。
图解:

代码示例:

  1. <font color="rgb(51, 51, 51)">                //KeySet获取
  2.                 Set<String> keySet = map.keySet();
  3.                 Iterator<String> it =  keySet.iterator();
  4.                 while(it.hasNext()){
  5.                         String key = it.next();
  6.                         String value =map.get(key);
  7.                         System.out.println(key+":"+value);
  8.                 }</font>
复制代码



(2)entrySet:将map集合中的映射关系存入到了set集合中, 然后使用迭代器将set集合元素取出,再根据 Map.Entry<Object, Object>的getKey(),getValue()方法取出。

这个关系的数据类型就是:Map.Entry
Map.Entry:映射项(键-值对)。它返回映射的 collection 视图,其中的元素属于此类。
获得映射项引用的唯一方法是通过此 collection 视图的迭代器来实现。这些 Map.Entry 对象仅在迭代期间有效;更确切地讲,如果在迭代器返回项之后修改了底层映射,则某些映射项的行为是不确定的,除了通过 setValue 在映射项上执行操作之外。
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。
图解:

代码示例:

  1. <font color="rgb(51, 51, 51)">//EntrySet
  2.                 Set<Map.Entry<String, String>> entrySet = map.entrySet();
  3.                 Iterator<Map.Entry<String, String>> it2 = entrySet.iterator();
  4.                 while(it2.hasNext()){
  5.                         Map.Entry<String, String> me = it2.next();
  6.                         String key = me.getKey();
  7.                         String value = me.getValue();
  8.                         System.out.println(key+"::"+value);
  9.                 }</font>
复制代码


Entry其实就是Map中的一个static内部接口。
为什么要定义在内部呢?
因为只有有了Map集合,有了键值对,才会有键值的映射关系。
关系属于Map集合中的一个内部事物。
而且该事物在直接访问Map集合中的元素。
3.map集合的嵌套
map集合的嵌套只是将其中的键或者值设置为一个map集合而已,其他操作都相同,只是相对麻烦些。没有什么理解难点。

3.小练习

由于字数限制练习部分做附件。

MapTest.zip

1019 Bytes, 下载次数: 45

小练习代码


作者: qihuan    时间: 2015-7-6 21:28
赞~~~~~~~~mark先~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2