定义:Map集合是一种双列集合,每个元素都包含两个数据。其每个元素的格式:key=value(键值对元素),因此Map集合也被称为“键值对集合”
整体格式:
- Collection集合的格式: [元素1,元素2,元素3..]
- Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , …}
**特点: **
Map集合的特点都是由键决定的
Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)
Map集合后面重复的键对应的值会覆盖前面重复键的值
Map集合的键值对都可以为null
几个实现类特点:
- HashMap:元素按照键是无序,不重复,无索引,值不做要求,Map集合中使用最多
- LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求
- TreeMap:元素按照建是排序,不重复,无索引的,值不做要求。
常用API
方法名称 | 说明 |
---|---|
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
遍历方式
- 方式一:键找值的方式遍历:先获取Map集合全部的键,再根据遍历键找值
- 方式二:键值对的方式遍历,把“键值对“看成一个整体,难度较大
- 方式三:JDK 1.8开始之后的新技术:Lambda表达式。
键找值:先获取Map集合的全部键的Set集合,然后遍历键的Set集合,然后通过键提取对应值。需涉及到的API如下:
方法名称 | 说明 |
---|---|
Set<K> keySet() | 获取所有键的集合 |
V get(Object key) | 根据键获取值 |
键值对:先把Map集合转换为Set集合,Set集合中每个元素都是键值对实体类型,然后遍历Set集合,提取键以及对应的值。需涉及到的API如下:
方法名称 | 说明 |
---|---|
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
K getKey() | 获得键 |
V getValue() | 获取值 |
Lambda表达式:简单、直接的遍历集合的方式。使用的API:default void forEach(BiConsumer<? super K, ? super V> action)
,结合lambda遍历Map集合
maps.forEach((k , v) -> {
System.out.println(k +"----->" + v);
});
HashMap
HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引
依赖hashCode方法和equals方法保证键的唯一。
如果键要存储的是自定义对象,需要重写hashCode和equals方法
HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已
实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已
LinkedHashMap
由键决定:有序、不重复、无索引。
这里的有序指的是保证存储和取出的元素顺序一致
原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。
TreeMap
- 由键决定特性:不重复、无索引、可排序
- 可排序:按照键数据的大小默认升序(有小到大)排序。只能对键排序。
- 注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序
- TreeMap跟TreeSet一样底层原理是一样的。
自定义排序规则有2种:①类实现Comparable接口,重写比较规则。②集合自定义Comparator比较器对象,重写比较规则。