- Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储,能够实现根据key快速查找value
- Map中的键值对以Entry类型的对象实例形式存在
- Map集合的键(key)不允许重复,value值可以重复,一个value值可以和很多key形成对应关系,每个键最多只能映射到一个值
-
Map支持泛型,形式如:Map<K, V>
Java-Map接口的关系图.png
常用方法 | 描述 |
---|---|
V put(K key, V, value) | 添加元素 如果键是第一次存储,直接存储值,返回null,否则将以前的值覆盖,返回以前的值 |
void clear() | 移除所有的键值对元素 |
V remove(Object key) | 根据键删除键值对元素,并把值返回 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
Set<Map.Entry<K,V>> entrySet() | 获取所有的键值对 |
V get(Object key) | 根据键获取值 |
Set<K> keySet() | 获取集合中所有键的集合 |
Collection<V> values() | 获取集合中所有值的集合 |
int size() | 返回集合中键值对的个数 |
实例
import java.util.HashMap;
import java.util.Map;
public class HashMapExercise {
public static void main(String[] args) {
exerciseMap();
}
public static void exerciseMap() {
Map<String, Integer> map = new HashMap<>();
// 添加方法
map.put("小红", 18);
map.put("小明", 30);
map.put("小辉", 20);
map.put("小李", 18);
System.out.println(map); // {小辉=18, 小明=18, 小李=18, 小红=18}
//判断键是否存在
boolean flg = map.containsKey("小明");
System.out.println(flg); // true
// 判断值是否存在
flg = map.containsValue(18);
System.out.println(flg); // true
// 判断集合是否为空
flg = map.isEmpty();
System.out.println(flg); // false
// 根据键获取值
Integer i = map.get("小李");
System.out.println(i); // 18
// 获取集合中元素的个数
int size = map.size();
System.out.println(size); // 4
}
}
Map集合的四种遍历方式
// Map集合的四种遍历方式
// 遍历结果
// Key:小辉,Value:20
// Key:小明,Value:30
// Key:小李,Value:18
// Key:小红,Value:18
// 第一种: 通过keySet()方法获取到所有键的Set集合
Set<String> keySet = map.keySet(); // map集合使用keySet()方法返回的是所有的key的值
for (String str : keySet) {
Integer in = map.get(str);
System.out.println("Key:"+str+",Value:"+in);
}
// 第二种: 通过entrySet()方法获取所有的键值对的Set集合 Entry<String, Integer>
Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); // map集合使用entrySet()方法返回的是所有的键值对
// 通过这种方式获得的所有键值对还需要使用迭代器进行遍历
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
System.out.println("Key:"+entry.getKey()+",Value:"+entry.getValue());
}
// 第三种: 使用foreach循环进行遍历;当容量较大时,推荐.
for (Map.Entry<String , Integer> entry: map.entrySet()) {
// Map.Entry<String, Integer> 映射项(键-值对)
// 这种方法也可用于 keySet()和values()
System.out.println("Key:"+entry.getKey()+",Value:"+entry.getValue());
}
// 第四种: 通过values()方法获取所有值的Collection集合
// 遍历结果
// value:20
// value:30
// value:18
// value:18
Collection<Integer> values = map.values();
Iterator<Integer> it = values.iterator();
while(it.hasNext()) {
Integer value = it.next();
System.out.println("value:"+value); // 我们不能通过值去进行键的查找
}
注: 使用entrySet遍历方式要比keySet遍历方式快-------entrySet遍历方式获取Value对象是直接从Entry对象中直接获得,时间复杂度T(n)=o(1);
keySet遍历获取Value对象则要从Map中重新获取,时间复杂度T(n)=o(n);keySet遍历Map方式比entrySet遍历Map方式多了一次循环,多遍历了一次table,当Map的size越大时,遍历的效率差别就越大。
网友评论