概述
现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,程序员和女朋友 。这种一一对应的关系,就叫做映射。
Java提供了专门的集合类用来存放这种对应关系的对象,即java.util.Map
接口。
java.util.Map
和java.util.Collection
的区别:
- Collection集合,元素孤立存在。(理解为单身),而Map集合,元素是成对存在的
- Collection集合称为单列集合,Map集合称为双列集合。
需要注意的是,Map集合不能包含重复的键,值可以重复,且每个键只能对应一个值。
Map接口中的常用方法
public V put(K key, V value)
: 将key与value存入Map集合中。public V remove(Object key)
: 删除指定的key对应的元素,并返回被删除元素的value值。public V get(Object key)
根据指定的key获取对应的value。boolean containsKey(Object key)
: 判断集合中是否包含指定的key。public Set<K> keySet()
: 获取Map集合中所有的key,存储到Set集合中。public Set<Map.Entry<K,V>> entrySet()
: 获取Map集合中所有的键值对对象的集合(Set集合)。
Map常用子类
HashMap
: 底层采用哈希表存储元素,元素存取无序。只允许一个key为null,允许多个Value为null。LinkedHashMap
: 底层采用哈希表和链表存储元素,是HashMap
的子类,唯一的区别在于元素存取有序。TreeMap
:底层采用红黑树(Red-Black tree)存储元素,且默认情况下根据自然顺序对元素进行排序。不允许key为null,允许Value为null 。
tips:以上三个map集合均为不同步的。
Hashtable
:和HashMap
的区别在于,Hashtable
是同步的(单线程),且key和value不允许为 null 。
tips:java.util.Hashtable
基本上不常用,不过它的子类java.util.Properties
是个唯一和IO流相结合的集合,目前仍然活跃在java舞台上,也算是给他老爹挣了点面子吧。
遍历Map的方式
一共有两种方式(其实是4中,另外两种不推荐)
- 遍历键与值:
map.entrySet()
public class Demo07 {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("钢铁侠",35);
map.put("蜘蛛侠",18);
map.put("黑寡妇",29);
map.put("惊奇队长",35);
//遍历键与值
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println("key= "+entry.getKey()+" ,value= "+entry.getValue());
}
}
}
- 遍历键或值:
map.entrySet()
public class Demo07 {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("钢铁侠",35);
map.put("蜘蛛侠",18);
map.put("黑寡妇",29);
map.put("惊奇队长",35);
//只遍历key
Set<String> set = map.keySet();
for (String key : set) {
System.out.println(key);
}
//只遍历value
Collection<Integer> values = map.values();
for (Integer value : values) {
System.out.println(value);
}
}
}