一. Map概述
1. 定义
Map是一种键-值对(key-value)集合,Map集合中的每一个元素都包含一个键(key)对象和一个值(value)对象,用于保存具有映射关系的数据。
Collection是单列集合,Map是双列集合
2. Map的特点
- key和value都可以是任意引用类型的数据
- key不允许重复,value可以重复
- 每个key可以映射到最多一个value
二. Map的常见实现类
常见实现类:HashTable、HashMap、TreeMap
1. HashTable
- 底层是哈希表数据结构
- 按哈希算法来存取键对象,用作键的对象必须实现hashCode方法和equals方法
- HashTable中元素的排列顺序是不固定的
- 不可以存入null键null值
- 该集合是线程同步的,效率低
2. HashMap
- 底层是哈希表数据结构
- 按哈希算法来存取键对象,用作键的对象必须实现hashCode方法和equals方法
- HashMap中元素的排列顺序是不固定的
- 可以存入null键null值
- 该集合是线程不同步的,效率高
3. TreeMap
- 底层是二叉树结构
- 可以用于给Map集合中的键进行排序,具体是自然排序还是比较器排序取决于所使用的构造方法
- 该集合是线程不同步的,效率高
构造方法:
(1)TreeMap()
- 构造一个新的空的树图,根据键的自然排序进行排序
- 插入到地图中的所有键必须实现Comparable接口
- 只能添加相同数据类型的键对象,否则会抛出ClassCastException
(2)TreeMap(Comparator<? super K> comparator)
- 构造一个新的空的树图,键对象根据指定的比较器进行排序(comparator为用于对该集合进行排序的比较器)
- 只能添加相同数据类型的键对象,否则会抛出ClassCastException
(3)TreeMap(Map<? extends K,? extends V> m)
- 构造一个包含指定树图中的元素的新树图,根据键的自然排序进行排序
- 插入到地图中的所有键必须实现Comparable接口
- 只能添加相同数据类型的键对象,否则会抛出ClassCastException
三. Map接口的共性方法
1. 添加
V put(K key,V value);//向Map集合中添加键-值对
void putAll(Map<?entends K,?entends V> m);//将指定Map中的key-value复制到本Map中
注意:对于put方法,如果添加时已有相同的键,那么后添加的值会覆盖原有的键对应的值,而且put方法会返回被覆盖的值
2. 删除
void clear();//删除该Map对象中所有的key-value对
V remove(Object key);//从Map集合中删除key对应的键-值对,并返回对应的value;如果该key不存在,则返回null
3. 判断
boolean containKey(Object key);//查询Map中是否包含指定的key,如果包含则返回true
boolean containValue(Object value);//查询Map中是否包含一个或多个value,如果包含则返回true
boolean isEmpty();//查询Map中是否为空(不包含任何key-value对),如果为空则返回true
4. 获取
V get(Object key);//返回Map集合中指定键对象所对应的值
int size();//返回Map集合中key-value对的个数
Collection<V> values();//返回Map里所有value组成的Collection
Set<K> keySet();//返回Map集合中所有键对象的Set集合
Set<Map.Entry<k,V>> entrySet();//返回Map集合中所有键-值对的Set集合,此Set集合中元素的数据类型为Map.Entry
注意:对于get方法,如果返回null,说明该键可能并不存在(虽然可能存在值为null但键不为null的情况)
5. 例子
import java.util.*;
class MapDemo{
public static void main(String[] args) {
//使用泛型,创建1个Map的子类对象
Map<String,String> map=new HashMap<String, String>();
//添加元素,如果添加时已有相同的键,那么后添加的值会覆盖原有的键对应的值,而且put方法会返回被覆盖的值
System.out.println(map.put("01","zhangsan"));
System.out.println(map.put("01","lisi"));
System.out.println(map);
//HashMap允许使用null键null值
map.put(null,"aha");
map.put("03","zhangsan3");
map.put("02","zhangsan2");
//判断
System.out.println("containsKey: "+map.containsKey("02"));
//获取
System.out.println("get: "+map.get("02"));
System.out.println("get: "+map.get(null));
Collection<String> coll=map.values();
System.out.println(coll);
//删除
System.out.println("remove: "+map.remove("02"));
System.out.println(map);
}
}
运行结果是:
四. Map集合的2种取出方法
Map集合没有迭代器,要先将Map集合转成Set集合,再通过迭代器取出
1. Set keySet()
(1)使用步骤
- 将map中所有的键存入Set集合中
- 因为Set集合具备迭代器,所以可以用迭代方式取出所有的键
- 再根据get(Key)方法,获取每一个键对应的值