Map集合是双列集合。
概述:现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证与个人等,这种一一对应的关系,就叫映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。
我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如:
Map集合与Collection集合的比较:
1.Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储;Map中的聚合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找所对应的值。
2.Collection中的集合称为单列集合,Map中的集合称为双列集合。
注意事项:
Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
Map集合特点:
1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value);
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同;
3.Map集合中的元素,key是不允许重复的,value是可以重复的;
4.Map集合中的元素,key和value是一一对应的。
Map接口中的常用方法:
public V put(K key,V value):把指定的键与指定的值添加到Map集合中。
注意:此处返回的V是该键对应的原先的值,如果以前没有,就返回null,以前有,替换掉,返回被替换前的值。
private static void show01() { // 创建Map集合,使用多态 Map<String,String> map = new HashMap<>(); String v1 = map.put("0","48"); // null String v2 = map.put("A","65"); // null String v3 = map.put("a","97"); // null String v4 = map.put("0","0"); System.out.println("v1:" + v1); // null System.out.println("v4:" + v4); // 48,返回被替换前的值 System.out.println(map); // {0=0, A=65, a=97},重写了toString方法 }
public V remove(Object key):把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
注意:key存在,返回被删除的值,key不存在,返回null;
private static void show02() { // 创建Map对象,key和value类型可以不同 Map<String,Integer> map = new HashMap<>(); map.put("0",48); // null map.put("A",65); // null map.put("a",97); // null // 观察可看到,这是一个无序集合 System.out.println(map); // {0=48, A=65, a=97} Integer v = map.remove("0"); System.out.println(v); // 48 System.out.println(map); // {A=65, a=97} Integer v2 = map.remove("aaa"); // 找不到不报错,返回空 // NullPointerException int v3 = map.remove("aaa"); // 自动拆箱,但报错 System.out.println(v3); // null }
boolean containsKey(Object key):根据指定的键,在Map集合中获取对应的值。
注意:key存在,返回对应的值,key不存在,返回null;
public V get(Object key):把指定的键所对应的键值对查找出来,返回值。
注意:key存在,返回对应值,key不存在,返回null;
private static void show03() { // 创建Map对象,key和value类型可以不同 Map<String,Integer> map = new HashMap<>(); map.put("0",48); // null map.put("A",65); // null map.put("a",97); // null System.out.println(map); // {0=48, A=65, a=97} boolean b = map.containsKey("0"); Integer v = map.get("0"); System.out.println(b); //true System.out.println(v); // 48 }
主要用于遍历的方法有:
public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中。
这种方式主要是通过键来找值:
public static void main(String[] args) { Map<String,Integer> map = new HashMap<>(); map.put("0",48); // null map.put("A",65); // null map.put("a",97); // null System.out.println(map); // {0=48, A=65, a=97} // 1.使用Map集合中的方法keySet,把Mao集合中所有的key取出来,存储到一个Set集合中 Set<String> keySet = map.keySet(); // {0=48, A=65, a=97} // 2.遍历set集合,获取Map集合中的每一个key Iterator<String> iterator = keySet.iterator(); while(iterator.hasNext()){ System.out.println(map.get(iterator.next())); } System.out.println("---------------"); // 或者使用增强for循环 for (String str:keySet) { System.out.println(map.get(str)); } }
Entry键值对对象:
Map里有一个嵌套类(内部类)Map.Entry<K,V>
我们已经知道,Map中存放的是两种对象,一种称为Key,一种称为valie,它们在Map中是一一对应的关系,这一对对象又称Map中的一个Entry(项)。Enry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对对象中获取对应的键和对应的值。
既然Entry表示了一堆键和值,那么也同样提供了获取对应键和对应值的方法:
public K getKey():获取Entry对象中的键
public V getValue():获取Entry对象中的值
在Map集合中也提供了获取所有Entry对象的方法:
public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)。
public static void main(String[] args) { Map<String,Integer> map = new HashMap<>(); map.put("0",48); // null map.put("A",65); // null map.put("a",97); // null System.out.println(map); // {0=48, A=65, a=97} // 1.使用Map集合中的方法entrySet,把Map集合中对各Entry对象取出来,存储到一个Set集合中 // public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合) Set<Map.Entry<String,Integer>> set = map.entrySet(); // 2.迭代遍历Set集合 // 注意,泛型是一个内部类对象 Iterator<Map.Entry<String,Integer>> iterator = set.iterator(); while(iterator.hasNext()){ // 获取每一个Entry对象 Map.Entry<String,Integer> entry = iterator.next(); System.out.print("键:" + entry.getKey()); System.out.println(",值:" + entry.getValue()); } System.out.println("-----------------"); // foreach遍历 for (Map.Entry<String,Integer> entry : set) { System.out.print("键:" + entry.getKey()); System.out.println(",值:" + entry.getValue()); } }