黑马程序员技术交流社区

标题: 浅谈java中的集合(四) [打印本页]

作者: IT_JM    时间: 2013-10-10 09:07
标题: 浅谈java中的集合(四)
第五讲     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. 1. /*
  2. 2. 每一个学生都有对应的归属地。
  3. 3. 学生Student,地址String。
  4. 4. 学生属性:姓名,年龄。
  5. 5. 注意:姓名和年龄相同的视为同一个学生。
  6. 6. 保证学生的唯一性。
  7. 7.
  8. 8. 思路:1、描述学生类
  9. 9. 2、定义一个Map集合,存储学生对象和地址值
  10. 10. 3、获取Map中的元素
  11. 11. */
  12. 12.
  13. 13. import java.util.*;
  14. 14.
  15. 15. //描述学生类
  16. 16. class Student implements Comparable<Student>
  17. 17. {
  18. 18. private String name;
  19. 19. private int age;
  20. 20. Student(String name,int age)
  21. 21. {
  22. 22. this.name=name;
  23. 23. this.age=age;
  24. 24. }
  25. 25. public String getName()
  26. 26. {
  27. 27. return name;
  28. 28. }
  29. 29.
  30. 30. public int getAge()
  31. 31. {
  32. 32. return age;
  33. 33. }
  34. 34.
  35. 35. //复写hashCode
  36. 36. public int hashCode()
  37. 37. {
  38. 38. return name.hashCode()+age*33;
  39. 39. }
  40. 40. //复写equals,比较对象内容
  41. 41. public boolean equals(Object obj)
  42. 42. {
  43. 43. if(!(obj instanceof Student))
  44. 44. throw new ClassCastException("类型不匹配");
  45. 45. Student s=(Student)obj;
  46. 46. return this.name.equals(s.name)&&this.age==s.age;
  47. 47. }
  48. 48.
  49. 49. //复写compareTo,以年龄为主
  50. 50. public int compareTo(Student c)
  51. 51. {
  52. 52. int num=new Integer(this.age).compareTo(new Integer(c.age));
  53. 53. if(num==0)
  54. 54. {
  55. 55. return this.name.compareTo(c.name);
  56. 56. }
  57. 57. return num;
  58. 58. }
  59. 59.
  60. 60. //复写toString,自定义输出内容
  61. 61. public String toString()
  62. 62. {
  63. 63. return name+"..."+age;
  64. 64. }
  65. 65.
  66. 66. }
  67. 67. class HashMapTest
  68. 68. {
  69. 69. public static void main(String[] args)
  70. 70. {
  71. 71. HashMap<Student,String > hm=new HashMap<Student,String >();
  72. 72. hm.put(new Student("zhangsan",12),"beijing");
  73. 73. hm.put(new Student("zhangsan",32),"sahnghai");
  74. 74. hm.put(new Student("zhangsan",22),"changsha");
  75. 75. hm.put(new Student("zhangsan",62),"USA");
  76. 76. hm.put(new Student("zhangsan",12),"tianjing");
  77. 77.
  78. 78. keyset(hm);
  79. 79. }
  80. 80.
  81. 81. //keySet取出方式
  82. 82. public static void keyset(HashMap<Student,String> hm)
  83. 83. {
  84. 84. Iterator<Student> it=hm.keySet().iterator();
  85. 85.
  86. 86. while(it.hasNext())
  87. 87. {
  88. 88. Student s=it.next();
  89. 89. String addr=hm.get(s);
  90. 90. System.out.println(s+":"+addr);
  91. 91. }
  92. 92. }
  93. 93. }
复制代码
2、Set<Map.Entry<K,V>>   entrySet():将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry
       其实,Entry也是一个接口,它是Map接口中的一个内部接口。   
  1. 1. interface Map
  2. 2. {
  3. 3. public static interface Entry
  4. 4. {
  5. 5. public abstract Object getKey();
  6. 6. public abstract Object getValue();
  7. 7. }
  8. 8. }
复制代码
  1. 1. class HashMapTest
  2. 2. {
  3. 3. public static void main(String[] args)
  4. 4. {
  5. 5. HashMap<Student,String > hm=new HashMap<Student,String >();
  6. 6. hm.put(new Student("zhangsan",12),"beijing");
  7. 7. hm.put(new Student("zhangsan",32),"sahnghai");
  8. 8. hm.put(new Student("zhangsan",22),"changsha");
  9. 9. hm.put(new Student("zhangsan",62),"USA");
  10. 10. hm.put(new Student("zhangsan",12),"tianjing");
  11. 11.
  12. 12. entryset(hm);
  13. 13. }
  14. 14. //entrySet取出方式
  15. 15. public static void entryset(HashMap<Student,String> hm)
  16. 16. {
  17. 17. Iterator<Map.Entry<Student,String>> it=hm.entrySet().iterator();
  18. 18.
  19. 19. while(it.hasNext())
  20. 20. {
  21. 21. Map.Entry<Student,String> me=it.next();
  22. 22. Student s=me.getKey();
  23. 23. String addr=me.getValue();
  24. 24. System.out.println(s+":::"+addr);
  25. 25. }
  26. 26. }
  27. 27. }
复制代码
关于Map.Entry:
        Map是一个接口,其实,Entry也是一个接口,它是Map的子接口中的一个内部接口,就相当于是类中有内部类一样。为何要定义在其内部呢?
        原因:a、Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。
                     b、并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2