不同于Collection集合,Map集合一次添加一对元素,所以也称为双列集合。map集合存储的是键值对,它必须保证键的唯一性。Map集合常用方法如下:
-
添加
V put(K key, V value) //返回一个和前key关联的值,没有则返回null -
删除
void clear() //清空容器
V remove(Object key) //如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 -
判断
boolean containsKey(Object key) //如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value) // 如果此映射将一个或多个键映射到指定值,则返回 true。
boolean isEmpty() -
获取
V get(Object key) // 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int size() //返回此映射中的键-值映射关系数。
Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。
Set< K > keySet() // 返回此映射中包含的键的 Set 视图。
Collection values() //返回此映射中包含的值的 Collection 视图。
Map的遍历方式比较特殊,其中一种是首先通过keySet获取到所有key的集合,然后再通过这个集合用Map的get方法获取到值:
HashMap<Integer, String> hm = new HashMap<>();
hm.put(21, "张三");
hm.put(22, "李四");
hm.put(23, "王五");
hm.put(24, "赵六");
Set<Integer> set = hm.keySet();
Iterator<Integer> it = set.iterator();
while (it.hasNext()){
Integer key = it.next();
String str = hm.get(key);
System.out.println(key + str);
}
还有一种遍历方法,通过 Set<Map.Entry<K,V>> entrySet() 方法获得了一个包含了键值映射关系(Map.Entry<K,V>类型)的Set集合,再通过Map.Entry<K,V>的getKey和getValue方法获取到键值:
HashMap<Integer, String> hm = new HashMap<>();
hm.put(21, "张三");
hm.put(22, "李四");
hm.put(23, "王五");
hm.put(24, "赵六");
Set<Map.Entry<Integer, String>> set = hm.entrySet();
Iterator<Map.Entry<Integer, String>> it = set.iterator();
while (it.hasNext()){
Map.Entry<Integer, String> me = it.next();
String str = me.getValue();
int key = me.getKey();
System.out.println(key + str);
}
还有一种方法,通过values方法获得一个value的集合,再通过这个集合迭代所有value:
HashMap<Integer, String> hm = new HashMap<>();
hm.put(21, "张三");
hm.put(22, "李四");
hm.put(23, "王五");
hm.put(24, "赵六");
//Set<Map.Entry<Integer, String>> set = hm.entrySet();
Collection<String> coll = hm.values();
Iterator<String> it = coll.iterator();
while (it.hasNext()){
String str = it.next();
System.out.println(str);
}
Map集合中常见的实现类有:
- HashTable: 内部结构是哈希表,是线程同步的,它不允许null作为键值。
- HashMap:内部是哈希表,不是线程同步的,允许null作为键值。
- TreeMap:内部是二叉树,不是线程同步的,它可以对Map容器的元素根据键进行排序。
- LinkedHashMap:HashMap的子类,具有元素有序性(存入和取出顺序一致)