多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Map<Key,Value>集合的共性方法: K - 此映射所维护的键的类型 V - 映射值的类型 增 put(K key, V value) putAll(Map<? extends K,? extends V> m) 删 remove(Object key) 判断 containsKey(Object key) 是否包含指定键 containsValue(Object value) 是否包含指定值 isEmpty() 查询 entrySet() 返回此映射中包含的映射关系的 Set 视图 get(Object key) keySet() 返回此映射中包含的键的 Set 视图。 ### Map的常用子类: |---HashTable: 底层是Hash表数据结构,不允许存入null键null值。线程同步的,JDK1.1,效率低 |---HashMap: 底层是Hash表数据结构,允许存入null键null值。线程不同步,JDK1.2,效率高(其余与HashTable基本相同) |---TreeMap:底层是二叉树数据结构,该映射根据其键的自然顺序进行排序。或者根据创建映射时提供的 Comparator 进行排序 ,具体取决于使用的构造方法。 ### Map集合的两种遍历方式: ~~~ import java.util.*; public class MapDemo{ public static void main(String []args){ Map<String,String> map = new HashMap<String,String>(); map.put("01","lzl-1"); map.put("02","lzl-2"); map.put("03","lzl-3"); map.put("04","lzl-4"); map.put("05","lzl-4"); method_keySet(map); method_entrySet(map); } public static void method_keySet(Map<String,String> map){ //通过keySet方法获取Set<key>类型的值。 Set<String> keySet = map.keySet(); //有了Set集合,就可以用到Iterator(迭代器)了 Iterator<String> it = keySet.iterator(); while(it.hasNext()){ //获取map集合中的key值 String key = it.next(); //通过Map集合中的get方法,获取Value值 String value = map.get(key); System.out.println("keySet方法--->"+" key:"+key+" value:"+value); } } /* */ public static void method_entrySet(Map<String,String> map){ //通过entrySet方法获取Map集合中的映射关系 Set<Map.Entry<String,String>> entrySet = map.entrySet(); //获取Set集合,使用迭代器提供的方法获取Map集合中存入的键值 Iterator<Map.Entry<String,String>> it = entrySet.iterator(); while(it.hasNext()){ //Entry是Map接口这种的内部静态接口,实现该接口的方法,都拥有getValue()和getKey()的方法。 Map.Entry<String,String> me = it.next(); String value = me.getValue(); String key = me.getKey(); System.out.println("entrySet方法--->"+" key:"+key+" value:"+value); } } } ~~~ ### 例子:一个学生对象,包括姓名和年龄。每个学生都有家庭住址。 我们认为学生的姓名和年龄相同表示同一个人。地址可以相同 步骤: 1、定义一个学生类,重写hashCode和equals方法。 并实现Comparable接口,重写compareTo(Object o1,Object o2)方法按照年龄和姓名的顺序来排列 2、将学生对象和学生的住址存入到HashMap中去。key--Student,value--String(地址) 3、通过keySet或者entrySet方法将数据一一取出。 解释: 因为HashMap底层是hash表,每次new一个对象时,会产生不同的hashCode。因此不能比较Student中姓名和年龄相同的值。 所以需要覆写hashCode和equals方法 实现Comparable接口,为了规范,可以使TreeMap集合存储Student对象的数据。若不实现,则不能用TreeMap存储。 ~~~ import java.util.*; //实现Comparable接口,提供按照姓名和年龄的自然顺序排序的方法 class Student implements Comparable<Student> { private String name; private int age; public Student(String name,int age){ this.name = name; this.age = age; } public int getAge(){ return age; } public String getName(){ return name; } public int compareTo(Student s){ int num = this.getName().compareTo(s.getName()); if(num == 0) return new Integer(this.getAge()).compareTo(new Integer(s.getAge())); return num; } public int hashCode(){ //保证new出的对象的hash值的唯一性 return name.hashCode()+age*60; } public boolean equals(Object obj){ if(!(obj instanceof Student)) throw new RuntimeException("类型不匹配"); Student stu = (Student)obj; return this.age==stu.getAge() && this.name.equals(stu.getName()); } public String toString(){ return "[name = "+name+" age = "+age+"]"; } } public class HashMapDemo{ public static void main(String args[]){ Map<Student,String> map = new HashMap<Student,String>(); map.put(new Student("lzl",18),"河南理工"); map.put(new Student("lzl1",18),"河南理工"); map.put(new Student("lzl2",18),"河南理工"); map.put(new Student("lzl3",18),"河南理工"); map.put(new Student("lzl4",18),"河南理工"); map.put(new Student("lzl4",18),"河南理工"); getInfo(map); } public static void getInfo(Map<Student,String> map){ Set<Map.Entry<Student,String>> entrySet = map.entrySet(); Iterator<Map.Entry<Student,String>> it = entrySet.iterator(); while(it.hasNext()){ Map.Entry<Student,String> me = it.next(); Student stu = me.getKey(); String address = me.getValue(); System.out.println("Student:"+stu+" address:"+address); } } } ~~~