添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

8.6 Java 8增强的Map集合

Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 key 另外一组值用于保存 Map 里的 value , key value 都可以是任何引用类型的数据。 Map key 不允许重复,即同一个 Map 对象的任何两个 key 通过 equals() 方法比较总是返回 false
key value 之间存在单向一对一关系,即通过指定的 key ,总能找到唯一的、确定的 value 。从 Map 中取出数据时,只要给出指定的 key ,就可以取出对应的 value 。如果把 Map 的两组值拆开来看, Map 里的数据有如图8.7所示的结构。
这里有一张图片
从图8.7中可以看出,如果把 Map 里的所有 key 放在一起来看,它们就组成了一个 Set 集合(所有的 key 没有顺序, key key 之间不能重复),实际上 Map 确实包含了一个 keySet() 方法,用于返回 Map 里所有 key 组成的 Set 集合。
不仅如此, Map key 集和 Set 集合里元素的存储形式也很像, Map 子类和 Set 子类在名字上也惊人地相似,比如 Set 接口下有 HashSet LinkedHashSet SortedSet (接口)、 TreeSet EnumSet 等子接口和实现类,而 Map 接口下则有 HashMap LinkedHashMap SortedMap (接口)、 TreeMap EnumMap 等子接口和实现类。正如它们的名字所暗示的, Map 的这些实现类和子接口中 key 集的存储形式和对应 Set 集合中元素的存储形式完全相同。
提示
Set Map 之间的关系非常密切。虽然 Map 中放的元素是 key-value 对, Set 集合中放的元素是单个对象,但如果把 key-value 对中的 value 当成 key 的附庸: key 在哪里, value 就跟在哪里。这样就可以像对待 Set 一样来对待 Map 了。事实上, Map 提供了一个 Entry 内部类来封装 key-value 对,而计算 Entry 存储时则只考虑 Entry 封装的 key 。从 Java 源码来看, Java 是先实现了 Map ,然后 通过包装一个所有 value 都为 null Map 就实现了 Set 集合
如果把 Map 里的所有 value 放在一起来看,它们又非常类似于一个 List :元素与元素之间可以重复每个元素可以根据索引来查找,只是 Map 中的索引不再使用整数值,而是以另一个对象作为索引。如果需要从 List 集合中取出元素,则需要提供该元素的数字索引;如果需要从 Map 中取出元素,则需要提供该元素的 key 索引。因此, Map 有时也被称为 字典 ,或 关联数组

Map接口方法

Map 接口中定义了如下常用方法。

Object put(Object key,Object value) 添加一个 key-value 对,如果当前 Map 中已有一个与该 key 相等的 key-value 对,则新的 key-value 对会 覆盖 原来的 key-value 对。 void putAll(Map map) 将指定 Map 中的 key-value 对复制到当前 Map 中。 Object get(Object key) 返回指定 key 所对应的 value ;如果此 Map 中不包含该 key ,则返回 null boolean isEmpty() 查询该 Map 是否为空(即不包含任何 key-value 对),如果为空则返回 true boolean containsKey(object key) 查询 Map 中是否包含指定的 key ,如果包含则返回 true Object remove(Object key) 删除指定 key 所对应的 key-value 对,返回被删除 key 所关联的 value ,如果该 key 不存在,则返回 null boolean remove(Object key,Object value) 这是 Java8 新增的方法,删除指定 key value 所对应的 key-value 对。如果从该 Map 中成功地删除该 key-value 对,该方法返回 true ,否则返回 false int size() 返回该 Map 里的 key-value 对的个数。 void clear() 删除该 Map 对象中的所有 key-value 对. Set keySet() 返回该 Map 中所有 key 组成的 Set 集合。 Collection values() 返回该 Map 里所有 value 组成的 Collection Set entrySet() 返回 Map 中包含的 key-value 对所组成的 Set 集合,每个集合元素都是 Map.Entry ( Entry Map 的内部类)对象。

Map的实现类

Map 接口提供了大量的实现类,典型实现如 HashMap Hashtable 等、 HashMap 的子类 LinkedHashMap ,还有 SortedMap 子接口及该接口的实现类 TreeMap ,以及 WeakHashMap Identity HashMap 等。下面将详细介绍 Map 接口实现类

Map的内部类Entry

Map 中包括一个内部类 Entry ,该类封装了一个 key-value 对。 Entry 包含如下三个方法。

Object getKey() 返回该 Entry 里包含的 key 值。 Object getValue() 返回该 Entry 里包含的 value 值。 Object setValue(V value) 设置该 Entry 里包含的 value 值,并返回新设置的 value 值。

Map 集合最典型的用法就是成对地 添加 删除``key-value 对,接下来即可判断该 Map 中是否包含指定 key ,是否包含指定 value ,也可以通过 Map 提供的 keySet() 方法获取所有 key 组成的集合,进而遍历 Map 中所有的 key-value 对。

实例

下面程序示范了 Map 的基本功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.*;

public class MapTest
{
public static void main(String[] args)
{
Map map = new HashMap();
// 成对放入多个key-value对
map.put("疯狂Java讲义" , 109);
map.put("疯狂iOS讲义" , 10);
map.put("疯狂Ajax讲义" , 79);
// 多次放入的key-value对中value可以重复
map.put("轻量级Java EE企业应用实战" , 99);
// 放入重复的key时,新的value会覆盖原有的value
// 如果新的value覆盖了原有的value,该方法返回被覆盖的value
System.out.println(map.put("疯狂iOS讲义" , 99)); // 输出109
System.out.println(map); // 输出的Map集合包含4个key-value对
// 判断是否包含指定key
System.out.println("是否包含值为 疯狂iOS讲义 key:"
+ map.containsKey("疯狂iOS讲义")); // 输出true
// 判断是否包含指定value
System.out.println("是否包含值为 99 value:"
+ map.containsValue(99)); // 输出true
// 获取Map集合的所有key组成的集合,通过遍历key来实现遍历所有key-value对
for (Object key : map.keySet() )
{
// map.get(key)方法获取指定key对应的value
System.out.println(key + "-->" + map.get(key));
}
map.remove("疯狂Ajax讲义"); // 根据key来删除key-value对。
System.out.println(map); // 输出结果不再包含 疯狂Ajax讲义=79 的key-value对
}
}

运行结果:

1
2
3
4
5
6
7
8
9
10
{疯狂Ajax讲义=79, 疯狂iOS讲义=99, 轻量级Java EE企业应用实战=99, 疯狂Java讲义=109}
是否包含值为 疯狂iOS讲义 key:true
是否包含值为 99 value:true
疯狂Ajax讲义-->79
疯狂iOS讲义-->99
轻量级Java EE企业应用实战-->99
疯狂Java讲义-->109
{疯狂iOS讲义=99, 轻量级Java EE企业应用实战=99, 疯狂Java讲义=109}

上面程序中先示范了向 Map 中成对地添加 key-value 对。添加 key-value 对时, Map 允许多个 value 重复,但如果添加 key-value 对时 Map 中已有重复的 key ,那么新添加的 value 会覆盖该 key 原来对应的 value 并返回被覆盖的 value
程序接下来的代码分别判断了 Map 集合中是否包含指定 key 、指定 value
程序中的 foreach 循环用于遍历 Map 集合:

  • 程序先调用 Map 集合的 keySet() 获取所有的 key ,然后使用 foreach 循环来遍历 Map 的所有 key ,根据 key 即可遍历所有的 value .
  • 所有的 Map 实现类都重写了 toString() 方法,调用 Map 对象的 toString() 方法总是返回如下格式的字符串: {key1=value,key2=value2…} .

    原文链接: 8.6 Java 8增强的Map集合