Map接口简介
Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value。
Map接口中的常用方法如下表。
HashMap集合
HashMap集合是Map接口的一个实现类,用于存储键值映射关系,但HashMap集合没有重复的键并且键值无序。接下来通过一个案例学习HashMap的用法。
Java import java.util.HashMap;
public class Example14 { public static void main(String[] args) { HashMap map = new HashMap(); // 创建Map对象 map.put("1", "张三"); // 存储键和值 map.put("2", "李四"); map.put("3", "王五"); System.out.println("1:" + map.get("1")); // 根据键获取值 System.out.println("2:" + map.get("2")); System.out.println("3:" + map.get("3")); } }
|
Map集合中的键具有唯一性,现在向Map集合中存储一个相同的键看看会出现什么情况,下面增加一行代码,如下所示:
Map中仍然只有3个元素,只是第二次添加的值“赵六”覆盖了原来的值“王五”,这也证实了Map中的键必须是唯一的,不能重复,如果存储了相同的键,后存储的值则会覆盖原有的值,简而言之就是:键相同,值覆盖。
在程序开发中,经常需要取出Map中所有的键和值,那么如何遍历Map中所有的键值对呢?有两种方式可以实现。
第一种方式就是先遍历Map集合中所有的键,再根据键获取相应的值。接下来通过一个案例来演示先遍历Map集合中所有的键,再根据键获取相应的值。
Java import java.util.HashMap; import java.util.Iterator; import java.util.Set;
public class Example15 { public static void main(String[] args) { HashMap map = new HashMap(); // 创建Map集合 map.put("1", "张三"); // 存储键和值 map.put("2", "李四"); map.put("3", "王五"); Set keySet = map.keySet(); // 获取键的集合 Iterator it = keySet.iterator(); // 迭代键的集合 while (it.hasNext()) { Object key = it.next(); Object value = map.get(key); // 获取每个键所对应的值 System.out.println(key + ":" + value); } } }
|
首先调用Map对象的KeySet()方法,获得存储Map中所有键的Set集合,然后通过Iterator迭代Set集合的每一个元素,即每一个键,最后通过调用get(String key)方法,根据键获取对应的值。
Map集合的另外一种遍历方式是先获取集合中的所有的映射关系,然后从映射关系中取出键和值。接下来通过一个案例演示这种遍历方式。
Java import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;
public class Example16 { public static void main(String[] args) { HashMap map = new HashMap(); // 创建Map集合 map.put("1", "张三"); // 存储键和值 map.put("2", "李四"); map.put("3", "王五"); Set entrySet = map.entrySet(); // 返回此映射中包含的映射关系的Set视图 Iterator it = entrySet.iterator(); // 获取Iterator对象 while (it.hasNext()) { // 获取集合中键值对映射关系 Map.Entry entry = (Map.Entry) (it.next()); Object key = entry.getKey(); // 获取Entry中的键 Object value = entry.getValue(); // 获取Entry中的值 System.out.println(key + ":" + value); } } }
|
首先调用Map对象的entrySet()方法获得存储在Map中所有映射的Set集合,这个集合中存放了Map.Entry类型的元素(Entry是Map内部接口),每个Map.Entry对象代表Map中的一个键值对,然后迭代Set集合,获得每一个映射对象,并分别调用映射对象的getKey()和getValue()方法获取键和值。
在Map中,还提供了一些操作集合的常用方法,例如,values()方法用于得到map实例中所有的value,返回值类型为Collection;size()方法获取map集合类的大小;containsKey()方法用于判断是否包含传入的键;containsValue()方法用于判断是否包含传入的值;remove()方法用于根据key移除map中的与该key对应的value等。
接下来通过一个案例演示Map这些方法的使用。
Java import java.util.Collection; import java.util.HashMap; import java.util.Iterator;
public class Example17 { public static void main(String[] args) { HashMap map = new HashMap(); // 创建Map集合 map.put("1", "张三"); // 存储键和值 map.put("3", "李四"); map.put("2", "王五"); map.put("4", "赵六"); System.out.println("集合大小为:" + map.size()); System.out.println("判断是否包含传入的键:" + map.containsKey("2")); System.out.println("判断是否包含传入的值:" + map.containsValue("王五")); System.out.println("移除键为1的值是:" + map.remove("1")); Collection values = map.values(); Iterator it = values.iterator(); while (it.hasNext()) { Object value = it.next(); System.out.println(value); } } }
|
从上面的例子可以看出,HashMap集合迭代出来元素的顺序和存入的顺序是不一致的。如果想让这两个顺序一致,可以使用Java中提供的LinkedHashMap类,它是HashMap的子类,与LinkedList一样,它也使用双向链表来维护内部元素的关系,使Map元素迭代的顺序与存入的顺序一致。
接下来通过一个案例学习LinkedHashMap的用法:
Java import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Set;
public class Example18 { public static void main(String[] args) { LinkedHashMap map = new LinkedHashMap(); // 创建Map集合 map.put("1", "张三"); // 存储键和值 map.put("2", "李四"); map.put("3", "王五"); Set keySet = map.keySet(); Iterator it = keySet.iterator(); while (it.hasNext()) { Object key = it.next(); Object value = map.get(key); // 获取每个键所对应的值 System.out.println(key + ":" + value); } } }
|