一、Map概述
ava.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。从概念上而言,您可以将 List 看作是具有数值键的 Map。而实际上,除了 List 和 Map 都在定义 java.util 中外,两者并没有直接的联系。本文将着重介绍核心 Java 发行套件中附带的 Map,同时还将介绍如何采用或实现更适用于您应用程序特定数据的专用 Map。
二、Map常用方法
添加、删除操作:
Object put(Object key,Object value)
Object remove(Object key)
void putAll(Map t)
void clear()
元视图操作的方法:
Set keySet()
Collection values()
Set entrySet()
元素查询的操作:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
boolean equals(Object obj)
三、Map实现类之一:HashMap()
Map接口的常用实现类:HashMap、TreeMap和Properties。
HashMap是 Map 接口使用频率最高的实现类。
允许使用null键和null值,与HashSet一样,不保证映射的顺序。
HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。
HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。
- @Test
- public void test2(){
- /**
- * 如何遍历Map
- * Set keySet()
- * Collection values()
- * Set entrySet()
- */
- Map map = new HashMap();
- map.put("AA" , 213);
- map.put("BB" , 456);
- map.put("BB", 45);
- map.put(123 , "CC");
- map.put(null , null);
- map.put(new Person("DD" , 23), 89);
- map.put(new Person("DD" , 23), 87);
- //1.遍历key集。
- Set set = map.keySet();
- for(Object object : set){
- System.out.println(object);
- System.err.println();
- }
- //2.遍历value集
- Collection values = map.values();
- Iterator iterator = values.iterator();
- while(iterator.hasNext()){
- System.out.println(iterator.next());
- }
- //3.如何遍历key-value对。
- //方式一:
- Set set2 = map.keySet();
- for(Object obj : set2){
- System.out.println(obj + "--->" + map.get(obj));
- }
- //方式二:
- Set set3 = map.entrySet();
- for (Object obj : set3) {
- Map.Entry entry = (Map.Entry)obj;
- System.out.println(entry.getKey() + "=" + entry.getValue());
- System.out.println(entry);
- }
- }
四、Map实现类之二:LinkedHashMap()
LinkedHashMap 是 HashMap 的子类
与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致
- @Test
- public void test3(){
- Map map = new LinkedHashMap();
- map.put("AA" , 213);
- map.put("BB" , 456);
- map.put("BB", 45);
- map.put(123 , "CC");
- map.put(null , null);
- map.put(new Person("DD" , 23), 89);
- Set set2 = map.keySet();
- for(Object obj : set2){
- System.out.println(obj + "--->" + map.get(obj));
- }
- }
五、Map实现类之三:TreeMap()
TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态。
TreeMap 的 Key 的排序:
自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException
定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口
TreeMap判断两个key相等的标准:两个key通过compareTo()方法或者compare()方法返回0。
若使用自定义类作为TreeMap的key,所属类需要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法应返回0。
- @Test
- public void test4(){
- Map map = new TreeMap();
- map.put(new Person("AA" , 23),89);
- map.put(new Person("MM" , 22),79);
- map.put(new Person("GG" , 33),99);
- map.put(new Person("JJ" , 13),69);
- Set set = map.keySet();
- for(Object o : set){
- System.out.println(o + "--->" + map.get(o));
- }
- }
