HashMap集合是Map接口的一个实现类,它用于存储键值映射关系,但必须保证不出现重复的键。接下来通过一个案例来学习HashMap的用法。
import java.util.HashMap; import java.util.Map; public class Example { public static void main(String[] args) { Map map = new HashMap(); // 创建Map 对象 map.put("1", "Jack"); // 存储键和值 map.put("2", "Rose"); map.put("3", "Lucy"); System.out.println("1: " + map.get("1")); // 根据键获取值 System.out.println("2: " + map.get("2")); System.out.println("3: " + map.get("3")); } }
运行结果:
1: Jack 2: Rose 3: Lucy
例中,首先通过Map的put(Object key,Object value)方法向集合中加入3个元素,然后通过Map的get(Object key)方法获取与键对应的值。前面讲过Map集合中的键具有唯一性,现在向Map集合中存储一个相同的键看看会出现什么情况。现对例进行修改,在第9行代码下面增加一行代码,如下所示:
map.put("3", "Mary");
运行结果:
1: Jack 2: Rose 3: Mary
从图中可以看出,Map中仍然只有3个元素,第二次添加的值“Mary”覆盖原来的值“Lucy”,因此证实了Map中的键必须是唯一的,不能重复。如果存储了相同的键,后存储的值则会覆盖原有的值,简而言之就是:键相同,值覆盖。在程序开发中,经常需要取出Map中所有的键和值,那么如何遍历Map中所有的键值对呢? 有两种方式可以实现,第一种方式就是先遍历Map集合中所有的键,再根据键获取相应的值,接下来就通过一个案例来演示这种遍历方式,如例所示。
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Example { public static void main(String[] args) { Map map = new HashMap(); // 创建Map 集合 map.put("1", "Jack"); // 存储键和值 map.put("2", "Rose"); map.put("3", "Lucy"); 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); } } }
运行结果:
1:Jack 2:Rose 3:Lucy
例中,是第一种遍历Map的方式。首先调用Map对象的keySet()方法,获得存储Map中所有键的Set集合,然后通过Iterator迭代Set集合的每一个元素,即每一个键,最后通过调用get(Stringkey)方法,根据键获取对应的值。
Map集合的另外一种遍历方式是先获取集合中的所有的映射关系,然后从映射关系中取出键和值。接下来通过一个案例来演示这种遍历方式,如例所示。
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Example { public static void main(String[] args) { Map map = new HashMap(); // 创建Map 集合 map.put("1", "Jack"); // 存储键和值 map.put("2", "Rose"); map.put("3", "Lucy"); Set entrySet = map.entrySet(); 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); } } }
运行结果:
1:Jack 2:Rose 3:Lucy
例7-17中,是第二种遍历Map的方式。首先调用Map对象的entrySet()方法获得存储在Map中所有映射的Set集合,这个集合中存放了Map.Entry类型的元素(Entry是Map接口内部类),每个Map.Entry对象代表Map中的一个键值对,然后迭代Set集合,获得每一个映射对象,并分别调用映射对象的getKey()和getValue()方法获取键和值。
在Map中,还提供了一个values()方法,通过这个方法可以直接获取Map中存储所有值的Collection集合,接下来通过一个案例来演示,如例所示。
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Example { public static void main(String[] args) { Map map = new HashMap(); // 创建Map 集合 map.put("1", "Jack"); // 存储键和值 map.put("2", "Rose"); map.put("3", "Lucy"); Collection values = map.values(); Iterator it = values.iterator(); while (it.hasNext()) { Object value = it.next(); System.out.println(value); } } }
运行结果:
Jack Rose Lucy
在例中,通过调用Map的values()方法获取包含Map中所有值的Collection集合,然后迭代出集合中的每一个值。
从上面的例子可以看出,HashMap集合迭代出来元素的顺序和存入的顺序是不一致的。如果想让这两个顺序一致,可以使用Java中提供的LinkedHashMap类,它是HashMap的子类,和LinkedList一样也使用双向链表来维护内部元素的关系,使Map元素迭代的顺序与存入的顺序一致。接下来通过一个案例来学习一下LinkedHashMap的用法,如例所示。
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; public class Example { public static void main(String[] args) { Map map = new LinkedHashMap(); // 创建Map 集合 map.put("1", "Jack"); // 存储键和值 map.put("2", "Rose"); map.put("3", "Lucy"); 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); } } }
运行结果:
1:Jack 2:Rose 3:Lucy
在例中,首先创建了一个LinkedHashMap集合并存入了3个元素,然后使用迭代器将元素取出。从运行结果可以看出,元素迭代出来的顺序和存入的顺序是一致的。