Map
- Map 集合没有继承 Collection 接口,提供的是键到值的映射,是存储 键-值对(key -value)的集合,详见:Java Collection 与 Map 的比较;
- 通过键来标识对象在映射中的存储位置,键不可重复,键本身不能决定存储位置,而是通过一种散列技术处理,产生一个散列码的整数值;
- 散列码常用作偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置;
- 当调用的映射中没有元素存在时,会引发 NoSuchElementException 异常,当对象与映射中的元素不兼容时,会引发 ClassCastException 异常,如果使用映射不允许使用的 null 对象,会引发 NullPointerException 异常,当试图改变一个不允许修改的映射时,会引发 UnsupportedOperationException 异常;
- java.util.Map,详见:Interface Map<K,V>;
1. 转换为集合(Set,Collection)
- 映射不是类集,但是可以获得类集的视图,可以使用 entrySet() 方法,它返回一个包含了映射中元素的集合(Set),用 keySet() 可以得到键的类集视图,用 values() 可以得到值得类集视图;
类型 | 方法 | 说明 |
---|
Set | entrySet() | 返回 Map 集合中所有键-值对的 Set 集合,Set 集合中元素的数据类型是 Map.Entry |
Set | keySet() | 返回 Map 中所有键对应的 Set 集合 |
Collection | values() | 返回一个映射中包含的值得类集,映射循环使用 get() 和 put(),put() 将一个指定了键的值加入映射,可以使用键作为参数来调用 get() 方法,返回该值 |
2. 提供的方法
类型 | 方法 | 说明 |
---|
Object | put(Object key, Object value) | 向 Map 集合中添加键-值对,返回键以前对应的值并把指定键所对应的值替换成指定的新值,如果没有这个键对应的值返回 null 并把指定的键值添加到集合中 |
void | putAll(Map m) | 将所有来自 m 的输入加入调用映射 |
Object | get(Object key) | 返回指定键映射的值,如果此映射不包含该键的映射关系返回 null,Object 是值的数据类型 |
void | clear() | 删除所有键-值对 |
int | size() | 返回映射中键-值对的个数 |
int | hashCode() | 返回调用映射的散列码 |
boolean | isEmpty() | 如果映射是空的,返回 true |
boolean | containsKey(Object k) | 如果映射包含了键 k,返回 true |
boolean | containsValue(Object v) | 如果映射包含了值 v,返回 true |
Object | remove(Object k) | 删除键为 k 的输入 |
boolean | equals(Object o) | 如果 o 是映射并包含了相同的输入,返回 true |
Set< K> | keySet() | 获取 Map 集合中所有的键,存储到 Set 集合中 |
Set<Map.Entry<K,V>> | entrySet() | 获取到 Map 集合中所有的键值对对象的集合(Set集合) |
import java.util.HashMap;
public class test {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("黄晓明", "杨颖");
map.put("文章", "马伊琍");
map.put("邓超", "孙俪");
System.out.println(map);
System.out.println(map.remove("邓超"));
System.out.println(map);
System.out.println(map.get("黄晓明"));
System.out.println(map.get("邓超"));
}
}
3. 遍历
- Map 集合不能直接使用迭代器或者 for each 进行遍历(转成 Set 之后可以使用);
方式1. 键找值方式
![方式1](https://i-blog.csdnimg.cn/blog_migrate/1b15aa0302981f0abbadd7211e5e2ec1.png)
方式2. 键值对方式(转成 Set)
![方式2](https://i-blog.csdnimg.cn/blog_migrate/127612e3595bbe418f4ad8e138cbaae4.png)
3. 常用子类
Map 接口中的集合都有两个泛型变量 <K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量 <K,V> 的数据类型可以相同,也可以不同;
- HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的 hashCode() 方法、equals() 方法,key 与 value 都可以为 null,线程不安全,详见:Java HashMap 哈希映射;
- TreeMap<K,V>:TreeMap 集合和 Map 相比没有特有的功能,底层的数据结构是红黑树;可以对元素的键进行排序,排序方式有两种:自然排序和比较器排序,key 不能为null,value 可以为 null,线程不安全,详见:Java TreeMap 树映射;
- LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法,详见:Java LinkedHashMap 链式哈希映射;