第五讲 Map集合 一、概述 1、简述: Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key) 2、特点: 1)该集合存储键值对,一对一对往里存 2)要保证键的唯一性。 二、Map集合的子类 Map |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。JDK1.0,效率低。 |--HashMap:底层是哈希表数据结构。允许使用null键null值,该集合是不同步的。JDK1.2,效率高。 |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的键进行排序。 Map和Set很像。其实Set底层就是使用了Map集合。 三、Map集合的常用方法 1、添加 Vput(K key,V value);//添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。 voidputAll(Map <? extends K,? extends V> m);//添加一个集合 2、删除 clear();//清空 Vremove(Object key);//删除指定键值对 3、判断 containsKey(Objectkey);//判断键是否存在 containsValue(Objectvalue)//判断值是否存在 isEmpty();//判断是否为空 4、获取 Vget(Object key);//通过键获取对应的值 size();//获取集合的长度 Collection<V>value();//获取Map集合中所以得值,返回一个Collection集合 还有两个取出方法,接下来会逐个讲解: Set<Map.Entry<K,V>>entrySet(); Set<K> keySet(); 注:HashMap集合可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。 四、Map集合的两种取出方式 Map集合的取出原理:将Map集合转成Set集合。再通过迭代器取出。 1、Set<K> keySet():将Map中所以的键存入到Set集合。因为Set具备迭代器。所以可以通过迭代方式取出所以键的值,再通过get方法。获取每一个键对应的值。 示例:
- 1. /*
- 2. 每一个学生都有对应的归属地。
- 3. 学生Student,地址String。
- 4. 学生属性:姓名,年龄。
- 5. 注意:姓名和年龄相同的视为同一个学生。
- 6. 保证学生的唯一性。
- 7.
- 8. 思路:1、描述学生类
- 9. 2、定义一个Map集合,存储学生对象和地址值
- 10. 3、获取Map中的元素
- 11. */
- 12.
- 13. import java.util.*;
- 14.
- 15. //描述学生类
- 16. class Student implements Comparable<Student>
- 17. {
- 18. private String name;
- 19. private int age;
- 20. Student(String name,int age)
- 21. {
- 22. this.name=name;
- 23. this.age=age;
- 24. }
- 25. public String getName()
- 26. {
- 27. return name;
- 28. }
- 29.
- 30. public int getAge()
- 31. {
- 32. return age;
- 33. }
- 34.
- 35. //复写hashCode
- 36. public int hashCode()
- 37. {
- 38. return name.hashCode()+age*33;
- 39. }
- 40. //复写equals,比较对象内容
- 41. public boolean equals(Object obj)
- 42. {
- 43. if(!(obj instanceof Student))
- 44. throw new ClassCastException("类型不匹配");
- 45. Student s=(Student)obj;
- 46. return this.name.equals(s.name)&&this.age==s.age;
- 47. }
- 48.
- 49. //复写compareTo,以年龄为主
- 50. public int compareTo(Student c)
- 51. {
- 52. int num=new Integer(this.age).compareTo(new Integer(c.age));
- 53. if(num==0)
- 54. {
- 55. return this.name.compareTo(c.name);
- 56. }
- 57. return num;
- 58. }
- 59.
- 60. //复写toString,自定义输出内容
- 61. public String toString()
- 62. {
- 63. return name+"..."+age;
- 64. }
- 65.
- 66. }
- 67. class HashMapTest
- 68. {
- 69. public static void main(String[] args)
- 70. {
- 71. HashMap<Student,String > hm=new HashMap<Student,String >();
- 72. hm.put(new Student("zhangsan",12),"beijing");
- 73. hm.put(new Student("zhangsan",32),"sahnghai");
- 74. hm.put(new Student("zhangsan",22),"changsha");
- 75. hm.put(new Student("zhangsan",62),"USA");
- 76. hm.put(new Student("zhangsan",12),"tianjing");
- 77.
- 78. keyset(hm);
- 79. }
- 80.
- 81. //keySet取出方式
- 82. public static void keyset(HashMap<Student,String> hm)
- 83. {
- 84. Iterator<Student> it=hm.keySet().iterator();
- 85.
- 86. while(it.hasNext())
- 87. {
- 88. Student s=it.next();
- 89. String addr=hm.get(s);
- 90. System.out.println(s+":"+addr);
- 91. }
- 92. }
- 93. }
复制代码2、Set<Map.Entry<K,V>> entrySet():将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry 其实,Entry也是一个接口,它是Map接口中的一个内部接口。 - 1. interface Map
- 2. {
- 3. public static interface Entry
- 4. {
- 5. public abstract Object getKey();
- 6. public abstract Object getValue();
- 7. }
- 8. }
复制代码- 1. class HashMapTest
- 2. {
- 3. public static void main(String[] args)
- 4. {
- 5. HashMap<Student,String > hm=new HashMap<Student,String >();
- 6. hm.put(new Student("zhangsan",12),"beijing");
- 7. hm.put(new Student("zhangsan",32),"sahnghai");
- 8. hm.put(new Student("zhangsan",22),"changsha");
- 9. hm.put(new Student("zhangsan",62),"USA");
- 10. hm.put(new Student("zhangsan",12),"tianjing");
- 11.
- 12. entryset(hm);
- 13. }
- 14. //entrySet取出方式
- 15. public static void entryset(HashMap<Student,String> hm)
- 16. {
- 17. Iterator<Map.Entry<Student,String>> it=hm.entrySet().iterator();
- 18.
- 19. while(it.hasNext())
- 20. {
- 21. Map.Entry<Student,String> me=it.next();
- 22. Student s=me.getKey();
- 23. String addr=me.getValue();
- 24. System.out.println(s+":::"+addr);
- 25. }
- 26. }
- 27. }
复制代码关于Map.Entry: Map是一个接口,其实,Entry也是一个接口,它是Map的子接口中的一个内部接口,就相当于是类中有内部类一样。为何要定义在其内部呢? 原因:a、Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。 b、并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。
|