映射(Map)

映射

映射(Map)是存储键和值间关联(即,键值对)的对象。给定一个键,可以找到其值。键和值都是对象。键必须唯一,但是值可以重复。

可以认为映射容器分为两部分,一部分保存键,一部分保存值,并且部分之间有关联(一个键对应一个值)。

几个键值对示例:

银行卡号——银行卡

身份证号——人

学号  —— 学生

//List集合:有索引的概念,索引只能是int类型

Map接口

Map是所有映射类的父接口:

interface  Map<K, V>

Map接口中的常用方法:

方法

描述

V put(K k, V v) 将一个条目放入到调用映射中,覆盖之前与此键关联的所有值。键和值分别为k和v。如果键不存在,则返回null;否则,返回之前与键相关联的值
V get(Object k) 返回与键k相关联的值。如果没有找到键,则返回null
V remove(Object k) 删除键等于k的条目
void clear() 删除调用映射中的所有键-值对
boolean containsKey(Object k) 如果调用映射包含k作为键,则返回true;否则,返回false
boolean containsValue(Object v) 如果映射包含v作为值,则返回true;否则,返回false

映射围绕两个基本操作:put()和get()。为了将值放入到映射中,使用put(),指定键和值。为了获取值,调用get(),传递键作为实参,值会被返回。

映射类

常用的映射类:HashMap(最常用)、LinkedHashMap、TreeMap

还有一个HashTable类

HashMap

HashMap实现了Map接口。它使用哈希表存储映射,即使对于比较大的集合,get()和put()的执行时间也保持不变。其声明如下:

class  HashMap<K, V>

HashMap类定义了以下构造方法

  1. HashMap()
  2. HashMap(int   capacity)  //指定容量,默认是16
  3. HashMap(int  apacity, float fillRatio) //充填比率,0.0-1.0之间,默认0.75

LinkedHashMap

LinkedHashMap扩展了HashMap类,该类在内部使用一个链表维护条目添加到映射中的顺序,从而可以按照插入顺序迭代整个映射

LinkedHashMap定义了以下构造方法:

  1. LinkedHashMap()
  2. LinkedHashMap(intcapacity)
  3. LinkedHashMap(intcapacity, float fillRatio)

TreeMap

TreeMap类扩展了AbstractMap类,并实现了NavigableMap接口。该类使用树结构存储条目。TreeMap提供了有序存储键/值对的高效手段,并支持快速检索。应当注意,TreeMap确保其元素以键的升序存储。

TreeSet中的元素和TreeMap中的键,必须能够比较大小。这些元素的类一定实现了Comparable接口。

TreeMap类定义了以下构造方法:

  1. TreeMap( )
  2. TreeMap(Comparator<?super K> comp)  //比较器对象作为参数

HashTable

HashTable是一个“遗留类”类,与HashMap类似,也实现了Map接口

HashTable与HashMap的主要区别:

  1. Hashtable是同步的、线程安全的,而HashMap不是同步的,没有实现线程安全。与Vector和ArrayList之间的区别类似。
  2. HashMap允许将null作为一个条目的key或者value,当然只能有一个条目的键为null。而Hashtable不允许。
  3. HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

映射的遍历

映射不是集合,Map不是继承自Collection接口,也没有继承Iterable接口。因此不能直接遍历映射。

注意:

Map与Collection没有关系,键值对相关的接口和类是单独的体系。

Map.Entry

Map.Entry是在Map接口的内部定义的接口,是内部接口。

在Map中存储的元素是键-值对,一个键-值对作为一个整体使用Map.Entry接口表示。Map.Entry定义的方法:

K  getKey() 返回该映射条目的键
V  getValue() 返回该映射条目的值
V  setValue(V v) 将这个映射条目的值设置为v

 获取映射的相关集合

为了遍历映射需要采用变通的方法:获得映射的集合视图。

  • 使用keySet(),返回包含映射中所有键的Set集合。
  • 使用values(),返回包含映射中所有值的Collection对象
  • 使用entrySet()方法,返回包含映射中所有元素(键-值对)的Set对象条目

对于这三个集合视图都是基于映射的,修改其中的一个集合会影响其他集合。
 

最后附上一张神图:

映射(Map)