Map集合介绍
Collection集合是单列集合,集合中的每个元素都是单个的,向集合中存储元素采用一个个的元素存储方式;
Map集合是双列集合,集合中的每个元素都是一组键值对(key-value),通过键可以找到对应的值。
需要注意的是:Map集合中的元素的键不能重复,值可以重复;每个键只能对应一个值。但是一个值可以对应多个键。
这就是 单列集合和双列集合在存储结构上的不同。
Map常用子类
通过查看
Map
接口描述,看到
Map
有多个子类,这里我们主要讲解常用的
HashMap
集合、
LinkedHashMap
集合。
- HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需 要重写键的hashCode()方法、equals()方法。
- LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链 表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键hashCode()方法、equals()方法。
Map接口中的常用方法
- public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
- public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
- public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
- public Set keySet() : 获取Map集合中所有的键,存储到Set集合中。
- public Set> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
注意:
- 在使用 put方法向集合中添加元素时,若指定的键(key)在集合中不存在,则没有这个键对应的值,返回null,并把指定的键值对添加到集合中;
- 若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把该键键所对应的值,替换成新值。
public class MapDemo {
public static void main(String[] args) {
//创建 map对象
HashMap<String, String> map = new HashMap<String, String>();
//添加元素到集合
map.put("黄晓明", "杨颖");
map.put("文章", "马伊琍");
map.put("邓超", "孙俪");
System.out.println(map);
//String remove(String key)
System.out.println(map.remove("邓超"));
System.out.println(map);
// 想要查看 黄晓明的媳妇 是谁
System.out.println(map.get("黄晓明"));
System.out.println(map.get("邓超"));
}
}
Map集合遍历
注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。
keySet()
由于Map集合中的元素都是以键值对存在的,而我们一般是通过键(key)来获取值(value)的,Map提供了一个可以获取Map集合中所有键的方法keySet(),获取集合中所有键并将这些键存储到set集合中。然后我们根据键来获取值。
步骤:
- 获取Map集合中所有键,并存入Set集合中。 ---- keySet()
- 根据键获取值。 ---- get(Key)
代码演示:
public class MyMap {
public static void main(String[] args) {
//创建Map集合对象
HashMap<String, String> map = new HashMap<String, String>();
//添加元素到集合
map.put("胡歌", "霍建华");
map.put("郭德纲", "于谦");
map.put("薛之谦", "大张伟");
// 获取map集合中所有的键,并存储到Set集合中
Set<String> keySet = map.keySet();
// 遍历Set集合中存储的Map集合的键,并通过键获取值
for (String key : keySet) {
System.out.println("CP组合: " + key + " --> " + map.get(key));
}
}
}
结果:
CP组合: 郭德纲 --> 于谦
CP组合: 薛之谦 --> 大张伟
CP组合: 胡歌 --> 霍建华
Entry键值对对象
除了上边的 keySet + get(key k) 方法获取map的键值对外,我们还可以通过键值对对象来遍历map集合。
map集合中的元素是以键值对组合的方式进行存储的,我们可以将每组键值对都封装成一个对象来操作,map提供了一个entrySet()方法来获取这些键值对对象,还为这些键值对对象提供了获取key和value的方法。
-
public Set> entrySet() : 获取Map集合中的多有键值对对象,然后将这些对象存储到Set集合中
-
public K getKey() :获取 Entry 对象中的键。 public V getValue() :获取 Entry 对象中的值。
-
public V getValue() :获取 Entry 对象中的值。
public static void testEntrySet() {
//创建Map集合对象
HashMap<String, String> map = new HashMap<String, String>();
//添加元素到集合
map.put("胡歌", "霍建华");
map.put("郭德纲", "于谦");
map.put("薛之谦", "大张伟");
// 获取map集合的键值对对象,并存储到Set集合中
Set<Map.Entry<String, String>> entries = map.entrySet();
// 遍历set集合,并获取键值对对象(entry)的键(key)和值(value)
for (Map.Entry<String, String> entry : entries) {
System.out.println("CP组合: " + entry.getKey() + " --> " + entry.getValue());
}
}
结果:
CP组合: 郭德纲 --> 于谦
CP组合: 薛之谦 --> 大张伟
CP组合: 胡歌 --> 霍建华