赞
踩
Map是一种键-值对(key-value)集合,Map集合中的每一个元素都包含一个键(key)对象和一个值(value)对象,用于保存具有映射关系的数据。
Collection是单列集合,Map是双列集合
常见实现类:HashTable、HashMap、TreeMap
构造方法:
V put(K key,V value);//向Map集合中添加键-值对
void putAll(Map<?entends K,?entends V> m);//将指定Map中的key-value复制到本Map中
注意:对于put方法,如果添加时已有相同的键,那么后添加的值会覆盖原有的键对应的值,而且put方法会返回被覆盖的值
void clear();//删除该Map对象中所有的key-value对
V remove(Object key);//从Map集合中删除key对应的键-值对,并返回对应的value;如果该key不存在,则返回null
boolean containKey(Object key);//查询Map中是否包含指定的key,如果包含则返回true
boolean containValue(Object value);//查询Map中是否包含一个或多个value,如果包含则返回true
boolean isEmpty();//查询Map中是否为空(不包含任何key-value对),如果为空则返回true
V get(Object key);//返回Map集合中指定键对象所对应的值
int size();//返回Map集合中key-value对的个数
Collection<V> values();//返回Map里所有value组成的Collection
Set<K> keySet();//返回Map集合中所有键对象的Set集合
Set<Map.Entry<k,V>> entrySet();//返回Map集合中所有键-值对的Set集合,此Set集合中元素的数据类型为Map.Entry
注意:对于get方法,如果返回null,说明该键可能并不存在(虽然可能存在值为null但键不为null的情况)
import java.util.*; class MapDemo{ public static void main(String[] args) { //使用泛型,创建1个Map的子类对象 Map<String,String> map=new HashMap<String, String>(); //添加元素,如果添加时已有相同的键,那么后添加的值会覆盖原有的键对应的值,而且put方法会返回被覆盖的值 System.out.println(map.put("01","zhangsan")); System.out.println(map.put("01","lisi")); System.out.println(map); //HashMap允许使用null键null值 map.put(null,"aha"); map.put("03","zhangsan3"); map.put("02","zhangsan2"); //判断 System.out.println("containsKey: "+map.containsKey("02")); //获取 System.out.println("get: "+map.get("02")); System.out.println("get: "+map.get(null)); Collection<String> coll=map.values(); System.out.println(coll); //删除 System.out.println("remove: "+map.remove("02")); System.out.println(map); } }
运行结果是:
Map集合没有迭代器,要先将Map集合转成Set集合,再通过迭代器取出
import java.util.*; class MapDemo{ public static void main(String[] args) { Map<String,String> map=new HashMap<String, String>(); map.put("02","zhangsan2"); map.put("03","zhangsan3"); map.put("01","zhangsan1"); map.put("04","zhangsan4"); //先获取Map集合中的所有键的Set集合,用keySet() Set<String> keyset=map.keySet(); //有了Set集合,就可以获取其迭代器 Iterator<String> it=keyset.iterator(); while(it.hasNext()){ String key=it.next(); //有了键,就通过Map集合的get方法获取其对应的值 String value=map.get(key); System.out.println("key: "+key+", value: "+value); } } }
运行结果是:
Map.Entry:
Entry接口是Map接口的一个内部接口,此接口为泛型,定义为Entry<K,V>,
它表示Map中的一个实体(一个key-value对),
接口中有getKey()、getValue()方法
import java.util.*; class MapDemo{ public static void main(String[] args) { Map<String,String> map=new HashMap<String, String>(); map.put("02","zhangsan2"); map.put("03","zhangsan3"); map.put("01","zhangsan1"); map.put("04","zhangsan4"); //将Map中的映射关系取出,存入到set集合中 Set<Map.Entry<String,String>> entrySet=map.entrySet(); Iterator<Map.Entry<String,String>> it=entrySet.iterator(); while (it.hasNext()){ Map.Entry<String,String> me=it.next(); String key=me.getKey(); String value=me.getValue(); System.out.println(key+":"+value); } } }
运行结果是:
需求:
存储学生对象及其对应的归属地,学生对象Student有属性姓名name和年龄age,归属地为String类型;
姓名和年龄相同的视为同一个学生,要保证学生的唯一性
思路:
代码:
HashMap容器中:用作键的对象必须实现hashCode方法和equals方法
import java.util.*; //描述学生 class Student{ private String name; private int age; Student(String name,int age){ this.name=name; this.age=age; } public String getName(){ return name; } public int getAge(){ return age; } public String toString(){ return name+":"+age; } //HashMap容器中,用作键的对象必须实现hashCode方法和equals方法 //复写hashCode方法 public int hashCode(){ return name.hashCode()+age*34; } //复写equals方法 public boolean equals(Object obj){ if(!(obj instanceof Student)) throw new ClassCastException("类型不匹配"); Student s=(Student)obj; //姓名和年龄相同的视为同一个学生 return this.name.equals(s.name)&&this.age==s.age; } } class MapTest{ public static void main(String[] args) { //定义HashMap容器,将学生作为键、归属地作为值存入容器 HashMap<Student,String> hm=new HashMap<Student,String>(); hm.put(new Student("lisi1",21),"Beijing"); hm.put(new Student("lisi1",21),"Tianjin"); hm.put(new Student("lisi2",22),"Shanghai"); hm.put(new Student("lisi3",23),"Nanjing"); hm.put(new Student("lisi4",24),"Wuhan"); //第一种取出方式 keySet Set<Student> keySet=hm.keySet(); Iterator<Student> it=keySet.iterator(); while (it.hasNext()){ Student stu=it.next(); String addr=hm.get(stu); System.out.println(stu+"..."+addr); } //第二种取出方式 entrySet Set<Map.Entry<Student,String>> entrySet=hm.entrySet(); Iterator<Map.Entry<Student,String>> it1=entrySet.iterator(); while (it1.hasNext()){ Map.Entry<Student,String> me=it1.next(); Student stu=me.getKey(); String addr=me.getValue(); System.out.println(stu+"......"+addr); } } }
运行结果是:
需求:
存储学生对象及其对应的归属地,学生对象Student有属性姓名name和年龄age,归属地为String类型;
姓名和年龄相同的视为同一个学生,要保证学生的唯一性;
对学生对象的年龄进行升序排序
思路:
代码:
自然排序,使用构造方法TreeMap():所有键必须实现Comparable接口
import java.util.*; //描述学生,实现Comparable接口 class Student implements Comparable<Student>{ private String name; private int age; Student(String name,int age){ this.name=name; this.age=age; } public String getName(){ return name; } public int getAge(){ return age; } public String toString(){ return name+":"+age; } //复写compareTo方法,按Student的年龄排序 public int compareTo(Student s){ int num=new Integer(this.age).compareTo(new Integer(s.age)); if(num==0){ return this.name.compareTo(s.name); } return num; } } class MapTest{ public static void main(String[] args) { //定义TreeMap容器,将学生作为键、归属地作为值存入容器 TreeMap<Student,String> tm=new TreeMap<Student,String>(); tm.put(new Student("lisi3",23),"Nanjing"); tm.put(new Student("lisi1",21),"Beijing"); tm.put(new Student("lisi4",24),"Wuhan"); tm.put(new Student("lisi1",21),"Tianjin"); tm.put(new Student("lisi2",22),"Shanghai"); //第一种取出方式 keySet Set<Student> keySet=tm.keySet(); Iterator<Student> it=keySet.iterator(); while (it.hasNext()){ Student stu=it.next(); String addr=tm.get(stu); System.out.println(stu+"..."+addr); } //第二种取出方式 entrySet Set<Map.Entry<Student,String>> entrySet=tm.entrySet(); Iterator<Map.Entry<Student,String>> it1=entrySet.iterator(); while (it1.hasNext()){ Map.Entry<Student,String> me=it1.next(); Student stu=me.getKey(); String addr=me.getValue(); System.out.println(stu+"......"+addr); } } }
需求:
按学生对象的姓名进行排序
思路:
定义TreeMap容易,使用按Student的姓名排序的比较器
代码:
比较器排序,使用构造方法TreeMap(Comparator<? super K> comparator):键对象根据指定的比较器进行排序
import java.util.*; //定义按Student的姓名排序的比较器 class StuNameComparator implements Comparator<Student>{ public int compare(Student o1, Student o2) { int num=o1.getName().compareTo(o2.getName()); if(num==0){ return new Integer(o1.getAge()).compareTo(new Integer(o2.getAge())); } return num; } } //描述学生,实现Comparable接口 class Student{ private String name; private int age; Student(String name,int age){ this.name=name; this.age=age; } public String getName(){ return name; } public int getAge(){ return age; } public String toString(){ return name+":"+age; } } class MapTest{ public static void main(String[] args) { //定义TreeMap容器,将学生作为键、归属地作为值存入容器 TreeMap<Student,String> tm=new TreeMap<Student,String>(new StuNameComparator()); tm.put(new Student("blisi3",23),"Nanjing"); tm.put(new Student("lisi1",21),"Beijing"); tm.put(new Student("alisi4",24),"Wuhan"); tm.put(new Student("lisi1",21),"Tianjin"); tm.put(new Student("lisi2",22),"Shanghai"); //第一种取出方式 keySet Set<Student> keySet=tm.keySet(); Iterator<Student> it=keySet.iterator(); while (it.hasNext()){ Student stu=it.next(); String addr=tm.get(stu); System.out.println(stu+"..."+addr); } //第二种取出方式 entrySet Set<Map.Entry<Student,String>> entrySet=tm.entrySet(); Iterator<Map.Entry<Student,String>> it1=entrySet.iterator(); while (it1.hasNext()){ Map.Entry<Student,String> me=it1.next(); Student stu=me.getKey(); String addr=me.getValue(); System.out.println(stu+"......"+addr); } } }
运行结果是:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。