A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄玉昆 黑马帝   /  2013-2-26 13:13  /  2498 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄玉昆 于 2013-2-26 18:21 编辑

下面看着有点多啊,详情请看我的博客:
http://blog.csdn.net/shengfeixiang/article/details/8605066
第一节   集合框架的概述
一、概述:
1、简述:
     所谓集合,就是为方便对多个对象的操作,对对象进行存储。集合就是存储对象最常用的一种方式。
2、集合与数组的区别:
     数组:可存储同种类型的数据,但长度固定,也可存储基本类型的数据
     集合:只可存储对象,长度可变,类型可以不同。
3、集合的特点:
     只用于存储对象,长度可变,也可存不同类型的对象。
     集合是一个接口,将每种容器的共性提取,形成的一个体系。
4、数据结构:
     由于每种容器对数据的存储方式都各不相同,所以出现了不同的容器。此种存储方式称之为数据结构。
二、集合体系如图:图1
三、集合中的共性方法:
下面从增删改查等方面对这些共性发方法进行简单介绍:
说明:
   a.add方法中的参数类型是Object,以便于接收任意类型的对象
   b.集合中存储的都是对象的引用(即地址)。
1、增加:
  add(Object obj);   ----->  添加元素
2、删除:
  remove();      ----->  删除集合中指定参数的元素
  removeAll();   ----->  删除当前集合中与另一集合相同的元素,即只保留与另一集合不同的元素
  clear();       ----->  清空集合中的元素,集合还存在
3、获取集合长度:
  size();        ----->  获取集合长度,即集合元素的个数
4、修改:
  set(int index,e);  ----->  将指定位置(index)上的元素修改为给定的参数e
5、判断:
  boolean contains(e); ----->  判断给定元素e是否存在于集合中
6、迭代器:iterator()   ----->  集合取出元素的方式
  boolean hasNext();   ----->  判断是否还有下一个元素
  next();              ----->  取出下一个元素

四、Collection接口包含的子类
Collection接口包含List与Set等子类
List:元素是有序的,元素可重复,因该集合体系有索引
Set:元素是无序的,元素不可重复
示例:
  1. import java.util.*;

  2. class CollectionDemo
  3. {
  4.         public static void sop(Object obj)
  5.         {
  6.                 System.out.println(obj);
  7.         }
  8.         
  9.         public static void main(String[] args)
  10.         {
  11.                 base_method();
  12.                 sop("------------------");
  13.                 method2();
  14.                 sop("------------------");
  15.                 method_get();
  16.         }
  17.         
  18.         public static void base_method()
  19.         {
  20.                 //创建一个集合容器,使用Collection接口的子类,ArrayList
  21.                 ArrayList al = new ArrayList();
  22.                 //1.添加元素--->add(Object obj),多态
  23.                 al.add("java01");
  24.                 al.add("java02");
  25.                 al.add("java03");
  26.                 al.add("java04");

  27.                 //打印原集合
  28.                 sop("原集合" + al);

  29.                 //3.删除元素
  30.                 al.remove("java02");
  31.                
  32.                 //清空集合中的元素
  33.                 al.clear();

  34.                 //4.判断元素
  35.                 //判断集合中是否存在某个元素:contains()
  36.                 sop("是否存在java03:" + al.contains("java03"));
  37.                 //判断集合是否为空:isEmpty()
  38.                 sop("判断集合是否为空:" + al.isEmpty());


  39.                 //2.获取个数,集合长度
  40.                 sop("size :" + al.size());

  41.                 //打印改变后集合
  42.                 sop(al);


  43.                 System.out.println("Hello World!");
  44.         }

  45.         public static void method2()
  46.         {
  47.                 //创建另一个新集合
  48.                 ArrayList at1 = new ArrayList();
  49.                 at1.add("java01");
  50.                 at1.add("java02");
  51.                 at1.add("java03");
  52.                 at1.add("java04");

  53.                 //打印原集合
  54.                 sop("原集合at1:" + at1);

  55.                 ArrayList at2 = new ArrayList();
  56.                 at2.add("java01");
  57.                 at2.add("java02");
  58.                 at2.add("java05");
  59.                 at2.add("java06");
  60.                 sop("原集合at2:" + at2);

  61.                 //removeAll()--->只保留和at2不相同的元素。
  62.                 at1.removeAll(at2);
  63.                 sop("remove后at1:" + at1);
  64.                 sop("now集合at2:" + at2);


  65.                 //取两个集合的交集,at1中只保留交集的部分
  66.                 at1.retainAll(at2);
  67.                
  68.                 sop("取完交集后的at1:" + at1);
  69.         }

  70.         public static void method_get()
  71.         {
  72.                 //创建另一个新集合
  73.                 ArrayList at1 = new ArrayList();
  74.                 at1.add("java01");
  75.                 at1.add("java02");
  76.                 at1.add("java03");
  77.                 at1.add("java04");

  78.                 //打印原集合
  79.                 sop("原集合at1:" + at1);

  80.                 //获取迭代器,用于去除集合中的元素
  81.                 Iterator it = at1.iterator();

  82.                 while (it.hasNext())
  83.                 {
  84.                         sop(it.next());
  85.                 }
  86.         }
  87. }
复制代码

集合体系1.PNG (24.78 KB, 下载次数: 35)

集合体系1.PNG

评分

参与人数 1黑马币 +15 收起 理由
Rancho_Gump + 15 很给力!

查看全部评分

9 个回复

倒序浏览
下面具体总结一下关于几种集合:
第二节   List集合
一、概述:
List集合包含三个子类:ArrayList、LinkedList以及Vector等。
具体区别如下:
1、ArrayList:底层的数据结构时数组结构
     特点:查询速度很快,因为有索引(角标),但增删速度稍慢。是线程不同步的。
2、LinkedList:底层使用的是链表数据结构
     特点:增删速度很快,但查询速度稍慢,因为每一个元素都链接到前一元素。
3、Vector:底层是数组结构,JDK1.0出现,比较老。
     特点:增删查询都很慢,被ArrayList替代了,线程是同步的。
二、对于List集合特有的方法:
凡是可操作角标的方法都是该体系特有的方法,基本方法和Collection中的一样。
1、增加:
   add(int index,e);              ----->  在指定位置增加给定的元素
   addAll(int index,Collection);   ----->  在指定位置增加给定集合中的所有元素,若省略位置参数,则在当前集合的后面依次添加元素
2、删除:
   remove(int index); ----->  删除集合中指定位置上的元素
3、修改:
   set(int index,e);  ----->  将指定位置(index)上的元素修改为给定的参数e
4、查询:
   get(int index);    ----->  获取指定位置上的元素
   indexOf(e);        ----->  通过指定元素获取其在集合中的位置
   subList(int from,int to);    ----->  获取从from到to位置上的元素
   Iterator listIterator();     ----->  返回Iterator接口类型值
注:
1、listIterator是List特有的迭代器,是Iterator子接口。在迭代时,不可通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModficationException异常。所以,在迭代时,只能用迭代器的方法操作,可Iterator方法是有限的,若想要其他操作如增删改写等,就需要使用子接口,即ListIterator,该接口只能通过List集合的listIerator方法获取。
2、在迭代时,循环中的next()调用一次,就要对hasNext判断一次,不可判断一次调用两次。
3、List集合判断元素是否相同,一句的是元素的equals方法,其中,contains中就是调用的equals方法。
  1. import java.util.*;
  2. class ListDemo
  3. {
  4.         public static void sop(Object obj)
  5.         {
  6.                 System.out.println(obj);
  7.         }
  8.        
  9.         public static void main(String[] args)
  10.         {
  11.                 methodAdd();
  12.                 //methodListIterator();
  13.         }

  14.         public static void methodAdd()
  15.         {
  16.                 //创建一个集合容器,使用Collection接口的子类,ArrayList
  17.                 ArrayList list = new ArrayList();
  18.                 //1.添加元素--->add(Object obj),多态
  19.                 list.add("java01");
  20.                 list.add("java02");
  21.                 list.add("java03");
  22.                 list.add("java04");

  23.                 ArrayList list2 = new ArrayList();
  24.                 //1.添加元素--->add(Object obj),多态
  25.                 list2.add("java05");
  26.                 list2.add("java06");
  27.                 list2.add("java07");
  28.                 list2.add("java08");

  29.                 //打印原集合
  30.                 sop("原集合:" + list);
  31.                 sop("------------------");

  32.                 //1.在某一个位置上添加元素:add(int index,"新元素")
  33.                 list.add(1,"java001");
  34.                 sop("增加后的集合:" + list);
  35.                 sop("---------");
  36.                 list.addAll(1,list2);
  37.                 sop("在list中1位置后添加list2:" + list);
  38.                 sop("------------------");

  39.                 //2.删除指定位置上的元素:
  40.                 list.remove(2);
  41.                 sop("删除后的集合:" + list);
  42.                 sop("------------------");

  43.                 //3.改变某一位置上的元素:set(int index,"要改成的元素")
  44.                 list.set(2,"java007");
  45.                 sop("改变角标为2的元素后的元素:" + list);
  46.                 sop("------------------");

  47.                 //4.获取元素:get()
  48.                 list.get(1);
  49.                 sop("获取角标为1上的元素:" + list.get(1));
  50.                 sop("------------------");

  51.                 //通过某个元素获取其在集合中的位置--indexOf("查找的元素")
  52.                 int m = list.indexOf("java007");
  53.                 sop("获取“java007”所在的位置:" + m);

  54.                 //获取从某个位置到另一位置上的元素subList()
  55.                 List l = list.subList(1,3);
  56.                 sop("获取从位置1到3上的元素:" + l);
  57.                 sop("------------------");

  58.                 //4.获取全部元素
  59.                 //get方法的for循环
  60.                 sop("get方法:");
  61.                 for (int i=0;i<list.size();i++)
  62.                 {
  63.                         sop("list(" + i + ")" + list.get(i));
  64.                 }
  65.                 sop("------------------");

  66.                 //迭代器方法:Iterator()
  67.                 for (Iterator it = list.iterator();it.hasNext(); )
  68.                 {
  69.                         sop("next:" + it.next());
  70.                 }
  71.                 sop("------------------");
  72. }

  73.         public static void methodListIterator()
  74.         {
  75.                 //演示列表迭代器:
  76.                 ArrayList list = new ArrayList();
  77.                 //1.添加元素--->add(Object obj),多态
  78.                 list.add("java01");
  79.                 list.add("java02");
  80.                 list.add("java03");
  81.                 list.add("java04");

  82.                 //打印原集合
  83.                 sop("原集合:" + list);
  84.                 sop("------------------");

  85.                

  86.                 //在迭代过程中,准备添加或删除元素
  87.                 for (ListIterator it = list.listIterator();it.hasNext(); )
  88.                 {
  89.                         Object obj = it.next();
  90.                         if (obj.equals("java01"))
  91.                                 it.remove();
  92.                         else if(obj.equals("java02"))
  93.                                 it.add("增加java200");
  94.                         else if(obj.equals("java03"))
  95.                                 it.set("修改为java300");
  96.                         sop("obj:" + obj);
  97.                 }
  98.                 sop("list :" + list);
  99.         }
  100. }
复制代码
三、Vector类:
Vector中有种特殊的取出方式,即为枚举
1、枚举和迭代器十分相似,其实两者是一样的,由于枚举的名称以及方法名都过长,因此,就被迭代器取代了。这里就不过多的介绍了。
四、LinkedList类特有方法:
一)JDK1.6之前的方法
1、增加:
   addFirst(obj);   ----->  在集合头部添加给定的元素
   addLast(obj);    ----->  在集合尾部添加给定的元素
2、获取:
   getFirst();   ----->  获取集合第一个元素,若集合中没有元素,则出现NoSuchElementException
   getLast();    ----->  获取集合最后一个元素,若集合中没有元素,则出现NoSuchElementException
3、删除:
   removeFirst();  ----->  获取并删除集合第一个元素,若集合中没有元素,则出现NoSuchElementException
   removeLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则出现NoSuchElementException
二)JDK1.6出现的替代方法:
1、增加:
   offerFirst(obj);   ----->  在集合头部添加给定的元素
   offerLast(obj);    ----->  在集合尾部添加给定的元素
2、获取:
   peekFirst();   ----->  获取集合第一个元素,若集合中没有元素,则返回null
   peekLast();    ----->  获取集合最后一个元素,若集合中没有元素,则返回null
3、删除:
   pollFirst();  ----->  获取并删除集合第一个元素 ,若集合中没有元素,则返回null
   pollLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则返回null

回复 使用道具 举报
第三节  Set 集合
一、概述:
1、Set集合的特点:
1)集合中的元素师无需的(存入和取出的顺序不一定一致),且元素不可重复。
2)Set集合的功能和Collection集合的是一样的,并没有什么特别的方法。
这里主要说一下关于HashSet和TreeSet两种集合的方法和特点:
二、HashSet类
1、特点:
   底层数据结构时哈希表,且元素取出方式只有迭代器方法
2、哈希表简介:
1)哈希表是按照哈希值的大小进行排列的,如果两个哈希值不同,则大的值放后面;如果两个哈希值相同,则再用equals方法比较两个元素的对象是否相同,如果不同,则将第二个值顺延,两个值串起来,放在同一个位置上。
2)取值时是按照哈希值取出来的。
3)哈希值的取值方式:哈希值存入哈希表中,哈希表也称散列表。散列表是存放记录的数组。具体来说,散列表是根据散列函数H(Key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”,作为这条记录在表中的存储位置,这种表表称为散列表,这一映象过程就称为散列造表或散列,所存储位置称为散列地址(这是百度百科上的内容)。我的理解是:存入的对象的地址是通过提取其信息摘要,通过散列函数计算而获得的一个关键码(Key)即哈希值,然后将这个值存入哈希表,而哈希表的存值方式是按照哈希值的大小顺序存储的,并且在这个哈希表中有自己的索引,但是哈希表的取值方式并不是按照索引的方式取出的。取出方式是按照哈希表中特有的算法取出的哈希值(注意,现在说的是哈希值,不是元素的取出),这些算法有直接寻址法、折叠法、平方取中法以及其他的一些方法等等。具体是按哪种算法查找的,我并不太清楚,所以,取出的哈希值可能就不是按照哈希值的大小顺序取出的了。
3、HashSet如何保证元素的唯一性:
通过元素的两个方法hasCode和equals方法来完成的。
如果元素的hashCode的值相同,才会判断equals是否为true。如果元素的hashCode值不相同,就不会调用equals方法了。
注:对于判断元素是否存在和删除(或添加)。依赖的方法是元素的hashcode和equals方法。
示例:
  1. /*
  2. 思路:
  3.         1、对人描述,将数据封装进对象
  4.         2、定义容器,将人存入
  5.         3、取出
  6.         4、移除
  7. */
  8. import java.util.*;
  9. class TypeException extends Exception
  10. {
  11.         TypeException(String message)
  12.         {
  13.                 super(message);
  14.         }
  15. }
  16. class Person
  17. {
  18.         private String name;
  19.         private int age;
  20.         Person(String name,int age)
  21.         {
  22.                 this.name = name;
  23.                 this.age = age;
  24.         }
  25.         public String getName()
  26.         {
  27.                 return name;
  28.         }
  29.         public int getAge()
  30.         {
  31.                 return age;
  32.         }
  33.         public int hashCode()
  34.         {
  35.                 return this.name.hashCode()+age*39;
  36.         }
  37.         public boolean equals(Object obj)
  38.         {
  39.                 try
  40.                 {
  41.                         if (!(obj instanceof Person))
  42.                                 throw new TypeException("NoSuchTypeException");
  43.                 }
  44.                 catch (TypeException e)
  45.                 {
  46.                         System.out.println(e.toString());
  47.                 }
  48.                 Person p = (Person)obj;
  49.                 return this.name.equals(p.name) && this.age == p.age;
  50.         }
  51. }
  52. class HashDemo
  53. {
  54.         public static void sop(Object obj)
  55.         {
  56.                 System.out.println(obj);
  57.         }

  58.         public static void printE(HashSet hs)
  59.         {
  60.                 Iterator it = hs.iterator();

  61.                 while (it.hasNext())
  62.                 {
  63.                         Person p = (Person)it.next();
  64.                         sop(p.getName() + "--" + p.getAge());
  65.                 }
  66.         }

  67.         public static void main(String[] args)
  68.         {
  69.                 HashSet hs = new HashSet();
  70.                 hs.add(new Person("a1",11));
  71.                 hs.add(new Person("a2",12));
  72.                 hs.add(new Person("a3",13));
  73.                 hs.add(new Person("a2",12));
  74.                 hs.add(new Person("a3",13));
  75.                 sop("原集合:");
  76.                 printE(hs);
  77.                 sop("移除后的集合:");
  78.                 hs.remove(new Person("a3",13));
  79.                 printE(hs);
  80.         }
  81. }
复制代码
三、TreeSet类:
1、特点:
1)底层的数据结构为二叉树结构(红黑树结构)
2)可对Set集合中的元素进行排序,是因为:TreeSet类实现了Comparable接口,该接口强制让增加到集合中的对象进行了比较,需要复写compareTo方法,才能让对象按指定需求(如人的年龄大小比较等)进行排序,并加入集合。
java中的很多类都具备比较性,其实就是实现了Comparable接口。
注意:排序时,当主要条件相同时,按次要条件排序。
3)二叉树示意图:图二
我通过对二叉树分布的测验,画了一个图,不知对否,仅供参考
对于存入时每个元素的比较,并不是连续排下来的,而是随着元素的个数而改变的,如图中所示:
第①步:22比较完了,如图①,之后会重新分布
第②部:以22为顶部,开始比较,如图②
第③步:比完第一个33后的图示,当比第二个33重复元素的时候,又重新分布了
第④步:分布如图,第二个33是按这个如比较的。
2、保证元素唯一性的依据:
实现的compareTo方法的返回值,是正整数、负整数或零,则两个对象较大、较小或相同。相等时则不会存入。



二叉树分布图示.png (37.36 KB, 下载次数: 35)

图二

图二
回复 使用道具 举报
3、两种比较方式:
      排序有两个要素:元素和集合
1)第一种排序方式:自然排序
      让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序或默认排序方式。
  1. <font size="1" face="Arial">/*
  2. 第一种排序方式:自然排序,实现Comparable接口,重写compareTo方法
  3. 需求:
  4. 向TreeSet集合中存储自定义对象学生
  5. 按照学生的年龄进行排序
  6. */
  7. import java.util.*;
  8. //此接口强制让Student实现比较性
  9. class Student implements Comparable
  10. {
  11. //定义Student私有属性
  12. private String name;
  13. private int age;
  14. //构造Student函数,初始化
  15. Student(String name,int age)
  16. {
  17. this.name = name;
  18. this.age = age;
  19. }
  20. //公共访问方法,访问私有属性
  21. public String getName()
  22. {
  23. return name;       
  24. }
  25. public int getAge()
  26. {
  27. return age;
  28. }
  29. //复写Comparator中的compare方法,自定义比较器
  30. public int compareTo(Object obj)
  31. {
  32. //判断是否属于Student类型,否则抛异常
  33. if (!(obj instanceof Student))
  34. throw new RuntimeException("NotSuchTypeException");
  35. //将Object类对象强转为Student类
  36. Student s = (Student)obj;

  37. //System.out.println(this.age + "--compare-" + s.age);//测试用,查看比较情况

  38. //按年龄大小比较,相同则比较姓名大小,不同返回两年龄之差
  39. if (this.age == s.age)
  40. {
  41. return this.name.compareTo(s.name);
  42. }
  43. else if (this.age <s.age)
  44. return this.age-s.age;
  45. return this.age-s.age;
  46. }
  47. /*
  48. //如果按照存入顺序输出
  49. public int compareTo()
  50. {
  51. return 1;//改为-1则按倒叙输出
  52. }
  53. */
  54. }
  55. //测试
  56. class TreeSetTest
  57. {
  58. public static void main(String[] args)
  59. {
  60. //创建集合,并添加元素
  61. TreeSet ts = new TreeSet();
  62. ts.add(new Student("li01",25));
  63. ts.add(new Student("li02",20));
  64. ts.add(new Student("li01",22));
  65. ts.add(new Student("li05",24));
  66. ts.add(new Student("li08",40));
  67. //打印集合中元素
  68. printE(ts);

  69. System.out.println("Hello World!");
  70. }

  71. //定义打印集合中元素的功能
  72. public static void printE(TreeSet ts)
  73. {
  74. //迭代器方法获取
  75. Iterator it = ts.iterator();

  76. while (it.hasNext())
  77. {
  78. //将返回的元素(Object类)强转为Student类
  79. Student s = (Student)it.next();
  80. System.out.println(s.getName() + "---" + s.getAge());
  81. }
  82. }
  83. }

  84. 2)第二种排序方式:比较器
  85. 当元素自身不具备比较性是,或者具备比较性,却不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时就有了比较方式(即参阅构造函数)。
  86. 当两种排序方式都存在时,以比较器为主。
  87. 如何构造比较器:定义一个类,实现Comparator接口,覆盖compare方法。
  88. 注:字符串本身具备比较性,但是它的比较方式可能不是所需要的,这时,就只能使用比较器了。
  89. import java.util.*;
  90. //此接口强制让Student实现比较性
  91. class Student implements Comparable
  92. {
  93. //定义Student私有属性
  94. private String name;
  95. private int age;
  96. //构造Student函数,初始化
  97. Student(String name,int age)
  98. {
  99. this.name = name;
  100. this.age = age;
  101. }
  102. //公共访问方法,访问私有属性
  103. public String getName()
  104. {
  105. return name;
  106. }
  107. public int getAge()
  108. {
  109. return age;
  110. }

  111. //复写Comparator中的compare方法,自定义比较器
  112. public int compareTo(Object obj)
  113. {
  114. //判断是否属于Student类型,否则抛异常
  115. if (!(obj instanceof Student))
  116. throw new RuntimeException("NotSuchTypeException");
  117. //按年龄大小比较,相同则比较姓名大小,不同返回两年龄之差
  118. Student s = (Student)obj;
  119. if (this.age > s.age)
  120. return this.age-s.age;
  121. else if (this.age == s.age)
  122. {
  123. return this.name.compareTo(s.name);
  124. }
  125. return this.age-s.age;
  126. }

  127. }

  128. //定义比较器,实现Comparator接口
  129. class MyCompare implements Comparator
  130. {
  131. //重写Comparator中的compare方法,按姓名顺序排序
  132. public int compare(Object o1,Object o2)
  133. {
  134. //判断给定对象是否为Student类,否则抛异常
  135. if (!((o1 instanceof Student) && (o2 instanceof Student)))
  136. throw new RuntimeException("NotSuchTypeException");
  137. //将给定对象强转为Student类
  138. Student s1 = (Student)o1;
  139. Student s2 = (Student)o2;
  140. //比较名字,返回数值,相同则比较年龄
  141. int n = s1.getName().compareTo(s2.getName());
  142. if (n == 0)
  143. return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  144. return n;
  145. }
  146. }
  147. //测试
  148. class TreeSetComDemo
  149. {
  150. public static void main(String[] args)
  151. {
  152. //TreeSet ts = new TreeSet();

  153. //创建集合,加入接口类参数,并添加元素
  154. TreeSet ts = new TreeSet(new MyCompare());
  155. ts.add(new Student("li01",25));
  156. ts.add(new Student("li02",20));
  157. ts.add(new Student("li01",22));
  158. ts.add(new Student("li05",24));
  159. ts.add(new Student("li08",40));

  160. //打印集合中元素
  161. printE(ts);
  162. }

  163. //定义打印集合中元素的功能
  164. public static void printE(TreeSet ts)
  165. {
  166. //迭代器方法获取
  167. Iterator it = ts.iterator();

  168. while (it.hasNext())
  169. {
  170. //将返回的元素(Object类)强转为Student类
  171. Student s = (Student)it.next();
  172. System.out.println(s.getName() + "---" + s.getAge());
  173. }
  174. }
  175. }
  176. </font>
复制代码
回复 使用道具 举报
第四节  Map 集合
一、概述:
1、简述:
      Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key)
2、特点:
1)该集合存储键值对,一对一对往里存
2)要保证键的唯一性。
二、方法简介:
Map集合中的方法和上面集合的方法是很相似的,这里不一一都具体说明了,用示例的形式体现一下:
1、添加:      添加单个元素:put(kkey,V value); 添加一个集合:putAll(Map<? extends K,? extends V> m)
2、删除:      获取并移除:remove(Objectkey); 清空集合中元素:clear (Object key)
3、判断:      判断集合是否为空:isEmpty()  ; 键对应的值是否存在:containsKey(Object key); 值对应的键是否存在:containsValue(Object obj)  ---->     返回boolean类型
4、获取:      获取单个元素:get(Objectkey); 获取长度:size();    获取Map集合中的所有值(value),返回Conllection集合。
注:
a.也可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。
b.其中put方法:如果出现添加相同的键,那么后添加的值会覆盖原有键对应的值,并且该方法返回被覆盖的值即原值。
示例:
  1. <font size="1" face="Arial">/*
  2. Map集合方法
  3. */
  4. import java.util.*;
  5. class MapDemo
  6. {
  7.         public static void sop(Object obj)
  8.         {
  9.                 System.out.println(obj);
  10.         }
  11.         public static void main(String[] args)
  12.         {
  13.                 //创建Map集合,并添加元素
  14.                 Map<Integer,String> map = new HashMap<Integer,String>();
  15.                 map.put(1,"zhangsan");
  16.                 map.put(2,"lisi");
  17.                 map.put(3,"wangwu");
  18.                 map.put(4,"heihei");
  19.                 map.put(5,"xixi");
  20.                 //获取长度
  21.                 int n = map.size();
  22.                 //打印元素
  23.                 sop("原集合:" + map + "\n长度为:" + n);
  24.                 sop("---------------------------------------");
  25.                 //创建新集合,并添加元素
  26.                 Map<Integer,String> m = new HashMap<Integer,String>();
  27.                 m.put(7,"zann");
  28.                 m.put(9,"hewi");
  29.                 m.put(13,"wangfei");
  30.                 m.put(14,"huxi");
  31.                 m.put(10,"anch");
  32.                 //用putAll将元素添加到原集合中
  33.                 map.putAll(m);
  34.                 sop("putAll --新集合:" + map);
  35.                 sop("----------------------------------");
  36.                 //删除元素
  37.                 sop("remove:" + map.remove(01));
  38.                 sop("新集合:" + map);
  39.                 sop("----------------------------------");
  40.                 /*
  41.                 //清空集合中的元素
  42.                 map.clear();
  43.                 sop("新集合:" + map);
  44.                 //判断是否为空集合
  45.                 boolean be = map.isEmpty();
  46.                 sop("isEmpty ,null? :" + be);
  47.                 sop("----------------------------------");
  48.                 */

  49.                 //判断元素是否存在
  50.                 boolean bk = map.containsKey(01);
  51.                 boolean bv = map.containsValue("wangwu");
  52.                 sop("判断:\n01?:" + bk + "-----  wangwu?:" + bv);
  53.                 sop("----------------------------------");
  54.                
  55.                 //获取元素:get
  56.                 String s = map.get(01);
  57.                 String s1 = map.get(02);
  58.                 //Integer i =  map.get("lisi");
  59.                 //Integer i2 = map.get("zhangsan");
  60.                 sop(map.get("lisi"));
  61.                 sop(map.get("zhangsan"));
  62.                 sop("获取元素get:01:" + s + ",02:" + s1);
  63.                 sop("-----------------------------------------------");
  64.                 //获取集合中的所有元素:Value
  65.                 Collection<String>  coll = map.values();
  66.                 sop("value--获取集合中所有元素:" + coll);
  67.                 sop("----------------------------------");
  68.         }
  69. }</font>
复制代码
三、Map集合中的子类:
1、HashTable:特点 -- > 底层是哈希表数据结构,不可存入null键和null值。该集合是线程同步的,效率较低
2、HashMap:特点   -- >  底层是哈希表数据结构,允许使用null值和null键。该集合是线程同步的,效率较高
3、TreeMap:特点     -- > 底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键值进行排序,和Set很像,其实,Set集合的底层就是使用了Map集合。
四、两种获取集合元素的方法:
        重点说一下获取方法中的两个:keySet()和entrySet()方法
1、keySet()方法获取元素
原理:将Map集合中的所有键存入到Set集合中,因为Set集合具备迭代器,所以可以用迭代方式取出所有的键,再根据get方法获取每一个键对应的值。简单说就是:Map集合---->Set集合 ---->迭代器取出
示例:
  1. <font size="1" face="Arial">//keySet集合测试

  2. import java.util.*;
  3. class KeySetDemo
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 //创建Map集合,并添加元素
  8.                 Map<Integer,String> map = new HashMap<Integer,String>();
  9.                 map.put(2,"zhangsan");
  10.                 map.put(6,"lisi");
  11.                 map.put(3,"wangwu");
  12.                 map.put(4,"heihei");
  13.                 map.put(5,"xixi");
  14.                 //获取map集合中的所有键的Set集合
  15.                 Set<Integer> keySet = map.keySet();
  16.                 //有了Set集合就可以获取其迭代器,取值
  17.                 Iterator<Integer> it = keySet.iterator();
  18.                 while (it.hasNext())
  19.                 {
  20.                         Integer i = it.next();
  21.                         String s = map.get(i);
  22.                         System.out.println(i + " = " + s);
  23.                 }
  24.         }
  25. }

  26. 2、entrySet()方法获取元素:
  27. 原理:将Map集合中的映射关系存入到了Set集合中,而这个映射关系的数据类型是Map.Entry,在通过迭代器将映射关系存入到Map.Entry集合中,并通过其中的getKey()和getValue()放取出键值。
  28. 示例:
  29. /*
  30. entrySet取出方式:
  31. */
  32. import java.util.*;
  33. class EntrySetDemo
  34. {
  35.         public static void main(String[] args)
  36.         {
  37.                 //创建集合,存入元素
  38.                 Map<String,String> map = new HashMap<String,String>();
  39.                 map.put("01","lisi1");
  40.                 map.put("02","lisi2");
  41.                 map.put("03","lisi3");
  42.                 map.put("04","lisi4");
  43.                 //获取map集合中的所有键,存入到Set集合中,
  44.                 Set<Map.Entry<String,String>> entry = map.entrySet();
  45.                 //通过迭代器取出map中的键值关系,迭代器接收的泛型参数应和Set接收的一致
  46.                 Iterator<Map.Entry<String,String>> it = entry.iterator();
  47.                 while (it.hasNext())
  48.                 {
  49.                         //将键值关系取出存入Map.Entry这个映射关系集合接口中
  50.                         Map.Entry<String,String>  me = it.next();
  51.                         //使用Map.Entry中的方法获取键和值
  52.                         String key = me.getKey();
  53.                         String value = me.getValue();
  54.                         System.out.println(key + " : " + value);
  55.                 }
  56.         }
  57. }

  58. 补充:关于Map.Entry
  59. Map是一个接口,其实,Entry也是一个接口,它是Map的子接口中的一个内部接口,就相当于是类中有内部类一样。为何要定义在其内部呢?
  60. 原因:a.Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。
  61.             b.并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。
  62. 五、Map集合的应用及扩展:
  63. 1、何时使用Map集合:当量数据之间存在着映射关系的时候,就应该想到使用Map集合。
  64. 2、示例:
  65. 获取该字符串中的字母出现的次数,如:"sjokafjoilnvoaxllvkasjdfns";希望打印的结果是:a(3)c(0).....
  66. 通过结果发现,每个字母都有对应的次数,说明字母和次数之间有映射关系。测试如下:
  67. import java.util.*;
  68. class MapTest
  69. {
  70.         public static void main(String[] args)
  71.         {
  72.                 String s = "abcsjokafjoilnvoaxllvkasjdfnsde 0[fga8/-abbdc";
  73.                 String str = LetterNum(s);
  74.                 System.out.println(str);
  75.         }

  76.         public static String LetterNum(String str)
  77.         {
  78.                 //将字符串转换成字符数组,因为对每个字母进行操作
  79.                 char[] ch = str.toCharArray();
  80.                 //定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMap集合
  81.                 TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
  82.                 int count = 0;
  83.                 //遍历字符数组,将每一个字母作为键去查map集合,
  84.                 for (int i=0;i<ch.length;i++)
  85.                 {
  86.                         //判断集合是否含有其他非字母,是则再次循环
  87.                         if (!(ch[i]>= 'a' && ch[i] <= 'z' || ch[i] >= 'A' && ch[i] <= 'Z'))
  88.                                 continue;
  89.                         //取出键对应的值,不为则计数器加1,存入集合,并将计数器清零,用于下一个字母
  90.                         Integer value = tm.get(ch[i]);
  91.                         if (value != null)
  92.                                 count = value;
  93.                         count++;
  94.                         tm.put(ch[i],count);
  95.                         count = 0;
  96.                 }
  97.                 //创建字符串容器,存入取出的键值即按顺序排列的字符串
  98.                 StringBuilder sb = new StringBuilder();
  99.                 //迭代器取出相应键值,并存入字符串容器
  100.                 Iterator<Map.Entry<Character,Integer>> it = tm.entrySet().iterator();
  101.                 while (it.hasNext())
  102.                 {
  103.                         Map.Entry<Character,Integer> me = it.next();
  104.                         Character key = me.getKey();
  105.                         Integer value = me.getValue();
  106.                         sb.append(key + "(" + value + ")");
  107.                 }
  108.                 return sb.toString();
  109.         }
  110. }
  111. </font>
复制代码
回复 使用道具 举报
三、扩展:
在很多项目中,应用比较多的是一对多的映射关系,这就可以通过嵌套的形式将多个映射定义到一个大的集合中,并将大的集合分级处理,形成一个体系。
示例如下:
  1. <font size="1" face="Arial">/*
  2. Map扩展:一对多的映射关系
  3. 如:学校中的  班级:学生:学号三者关系
  4. 思路,
  5.         先创建大的集合,学校,如school
  6.         其中包含班级这个小集合,如room
  7.         班级中包含的学生有姓名,如name
  8.                                 学生有学号,如id
  9. */
  10. import java.util.*;
  11. //创建学生类,定义私有属性
  12. class Student
  13. {
  14.         private String name;
  15.         private String id;
  16.         Student(String name,String id)
  17.         {
  18.                 this.name = name;
  19.                 this.id = id;
  20.         }
  21.         //复写toString方法,给出指定字符串形式
  22.         public String toString()
  23.         {
  24.                 return name + ":" + id;
  25.         }
  26. }
  27. //测试
  28. class MapsDemo
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 //创建一个学校,里面有班级
  33.                 HashMap<String,HashMap<String,String>> czbk = new HashMap<String,HashMap<String,String>>();
  34.                 //创建两个班级,里面有学生
  35.                 //基础班
  36.                 HashMap<String,String> base = new HashMap<String,String>();
  37.                 //预热班
  38.                 HashMap<String,String> adv = new HashMap<String,String>();
  39.                 //将信息分别加入集合
  40.                 //学校中的班级信息
  41.                 czbk.put("Base",base);
  42.                 czbk.put("Adv",adv);
  43.                 //基础班中的学生信息
  44.                 base.put("01","BS01");
  45.                 base.put("02","BS02");
  46.                 base.put("03","BS03");
  47.                 //提高班中的学生信息
  48.                 adv.put("01","ADV01");
  49.                 adv.put("02","ADV02");
  50.                 adv.put("03","ADV03");
  51.                 //调用取出信息的方法
  52.                 String all = getAll(czbk);
  53.                 System.out.println("ALL: \n" + all);
  54.         }

  55.         //定义取出方法
  56.         //定义取出学校中班级的方法,并调用取出学生信息方法
  57.         public static String getAll(HashMap<String,HashMap<String,String>> school)
  58.         {
  59.                 //定义存储班级信息字符串容器
  60.                 StringBuilder sb = new StringBuilder();
  61.                 //初始化班级为空
  62.                 String room = null;
  63.                 //将学校中的班级存入Set集合,并用迭代器获取
  64.                 Set<String> keySet = school.keySet();
  65.                 Iterator<String> it = keySet.iterator();
  66.                 while(it.hasNext())
  67.                 {
  68.                         room = it.next();
  69.                         //取出班级中的学生信息也放在容器中
  70.                         HashMap<String,String>  hm = school.get(room);
  71.                         //将班级中的学生信息字符串形式存入字符串容器中
  72.                         sb.append(room + ":\n"+ getRoom(hm) );
  73.                 }
  74.                 //返回一个容器字符串,为学生信息
  75.                 return sb.toString();
  76.         }
  77.         //定义取出班级中学生信息的方法,被上面的方法调用
  78.         public static String getRoom(HashMap<String,String> room)
  79.         {
  80.                 //定义存储学生信息的字符串容器
  81.                 StringBuilder sb = new StringBuilder();
  82.                 //将班级中的学生信息存入Set集合,并用迭代器获取
  83.                 Set<Map.Entry<String,String>> entrySet = room.entrySet();
  84.                 Iterator<Map.Entry<String,String>> it = entrySet.iterator();
  85.                 while(it.hasNext())
  86.                 {
  87.                         //将映射关系存入Map.Entry的集合中,并获取相应键值
  88.                         Map.Entry<String,String> me = it.next();
  89.                         String key = me.getKey();
  90.                         String value = me.getValue();
  91.                         //将学生信息存入到字符串容器中
  92.                         sb.append(key + "::" + value + "\n");
  93.                 }
  94.                 //放回存有学生信息的字符串容器
  95.                 return sb.toString();
  96.         }
  97. }
  98. </font>
复制代码
回复 使用道具 举报
谢谢分享   
回复 使用道具 举报
黄玉昆 黑马帝 2013-2-26 13:29:09
8#
黑马刘杰 发表于 2013-2-26 13:25
谢谢分享

为的是共同学习和交流嘛,嘿嘿

评分

参与人数 1黑马币 +21 收起 理由
付玉光 + 21 很给力!

查看全部评分

回复 使用道具 举报
谢谢LZ分享.学习了.
回复 使用道具 举报
{:soso_e179:}

评分

参与人数 1黑马币 +21 收起 理由
付玉光 + 21 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马