第一 集合框架的概述


集合类的由来:
 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定,就使用集合容器进行存储。
 

集合和数组的区别:

  1. 数组虽然可以存储对象,但是长度是固定的;集合长度是可变的
  2. 数组中能存储基本数据类型,集合只能存储对象,可以存储不同类型的对象。
数据结构:由于每种容器对数据的存储方式都各不相同,所以出现了不同的容器,且每种容器都有自己特有的数据结构。

不断的向上抽取,就形成了集合框架。
集合的一些技巧:
需要唯一吗? 
需要:Set
     需要制定顺序:
     需要: TreeSet(指定方式排序)
    不需要:HashSet
    但是想要一个和存储一致的顺序(有序:怎么存怎么取):LinkedHashSet
不需要:List
    需要频繁增删吗?
    需要:LinkedList
    不需要:ArrayList
 如何记录每一个容器的结构和所属体系呢?
看名字!
List
 |--ArrayList
 |--LinkedList
Set
 |--HashSet
 |--TreeSet
后缀名就是该集合所属的体系。
前缀名就是该集合的数据结构。

看到array:就要想到数组,就要想到查询快,有角标.
看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。
看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。
而且通常这些常用的集合容器都是不同步的。



框架的顶层Collection接口:
  • List、Set集合的共性方法:

从上图可以看出List和Set的父类是Collection,所以Collection所具备的方法就是他们所共有的共性方法

Collection定义了集合框架的共性功能。

1、添加 
 add(e);添加一个元素        addAll(collection);添加一组collection中所有元素

 2、删除  
remove(e);删除一条元素       removeAll(collection);删除一组collection中所有元素    clear();清空集合

3、判断
contains(e);是否包含某个元素
isEmpty();判空
 boolean containsAll(Colllection coll);

4,获取:
 int size():集合的大小,也就是获取集合中的元素个数。

5,其他:
 boolean retainAll(Collection coll);取交集。
 Object[] toArray():将集合转成数组。 

6. Iterator 
iterator():取出元素的方式:迭代器。
 该对象必须依赖于具体容器,因为每一个容器的数据结构都不同,所以该迭代器对象是在容器中进行内部实现的。
 对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可, 也就是iterator方法。
通过迭代的方式获取集合中的每个元素,简单的说就是遍历集合
 Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
 其实就是抓娃娃游戏机中的夹子!
 
boolean hasNext()
          如果仍有元素可以迭代,则返回 true
 E next()
          返回迭代的下一个元素。
 void remove()
      从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

示例:
lang包核心包不需要导入,其他包需要手动导入,如util工具包
  1. public class CollectionDemo {
  2. public static void main(String[] args) {
  3. Collection coll = new ArrayList();//子类可随便写,为了使用接口的使用方法
  4. Collection c1 = new ArrayList();
  5. Collection c2 = new ArrayList();
  6. show(c1,c2);
  7. }
  8. public static void show(Collection c1,Collection c2){
  9. //给c1添加元素
  10. c1.add("abc1");
  11. c1.add("abc2");
  12. c1.add("abc3");
  13. c1.add("abc4");
  14. //给c2添加元素
  15. c2.add("abc1");
  16. c2.add("abc2");
  17. c2.add("abc3");
  18. c2.add("abc4");
  19. c2.add("abc5");
  20. System.out.println("c1:"+c1);
  21. System.out.println("c2:"+c2);
  22. //演示addAll
  23. // c1.addAll(c2);//将c2中的元素添加到c1中
  24. //演示removeAll
  25. // boolean b = c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除
  26. // System.out.println("removeAll:"+b);
  27. //演示containsAll
  28. // boolean b = c1.containsAll(c2);
  29. // System.out.println("containsAll:"+b);
  30. //演示retainAll
  31. boolean b = c1.retainAll(c2);//取交集,保留和指定的集合相同的元素,而删除不同的元素
  32. //和removeAll功能相反
  33. System.out.println("retainAll:"+b);
  34. System.out.println("c1:"+c1);
  35. }
  36. public static void show(Collection coll){
  37. //1,添加元素
  38. coll.add("abc1");
  39. coll.add("abc2");
  40. coll.add("abc3");
  41. System.out.println(coll);
  42. //2,删除元素
  43. // coll.remove("abc2");//会改变集合的长度,当清除的内容不存在时,返回原集合
  44. //清空集合
  45. // coll.clear();
  46. System.out.println(coll.contains("abc3"));
  47. System.out.println(coll);
  48. }
  49. public class IteratorDemo {
  50. public static void main(String[] args) {
  51. Collection coll = new ArrayList();
  52. coll.add("abc1");
  53. coll.add("abc2");
  54. coll.add("abc3");
  55. coll.add("abc4");
  56. // System.out.println(coll);
  57. //使用了Collection中的iterator()方法,调用集合中的迭代器方法,是为了获取集合中的迭代器对象
  58. // Iterator it = coll.iterator();
  59. // while(it.hasNext()){
  60. // System.out.println(it.next());
  61. // }
  62. for(Iterator it = coll.iterator(); it.hasNext(); ){
  63. System.out.println(it.next());
  64. //for循环的方式在内存中稍优于while,因为for循环中的局部变量随着for循环的消亡而消亡
  65. }
  66. // System.out.println(it.next());
  67. // System.out.println(it.next());
  68. // System.out.println(it.next());
  69. // System.out.println(it.next());
  70. // System.out.println(it.next());
  71. //java.util.NoSuchElementException 如果这样写没有下一个了就异常了
  72. }
  73. }

Collection接口包含的子类:
Collection接口包含最常用的子类是List与Set
List:元素是有序的,元素可重复,因该集合体系有索引
Set:元素是无序的,元素不可重复
迭代器:
因为每种容器的数据结构都不同,所以取出的细节也就不同,所以就把迭代器定义在容器的内部,方便于访问集合内部的元素。然而他们也有共性内容就是判断和取出,就对其进行了抽取就成了Iterator接口,就可以通过Iterator的判断取出方式就可以对元素取出。在迭代时next()最好只调用一次,因为集合中的元素是奇数次的话,就会发生异常,所以具有安全隐患。
注意:1、add方法的参数类型是Object。以便于接收任意类型对象。

           2、集合中存储的都是对象的引用(地址)



第二:list集合

一、概述:

1、常见的list集合有,"java09");

  • //删除指定位置的元素。
  • //al.remove(2);
  • //修改元素。
  • //al.set(2,"java007");
  • //通过角标获取元素。
  • sop("get(1):"+al.get(1));
  • sop(al);
  • //获取所有元素:有序的就可以用这样的取值方式,list特有的取出元素的方式之一
  • for(int x=0; x<al.size(); x++)
  • {
  • System.out.println("al("+x+")="+al.get(x));
  • }
  • Iterator it = al.iterator();
  • while(it.hasNext())
  • {
  • sop("next:"+it.next());
  • }
  • //通过indexOf获取对象的位置。
  • sop("index="+al.indexOf("java02"));
  • List sub = al.subList(1,3);
  • sop("sub="+sub);
  • }
  • public static void main(String[] args)
  • {
  • //演示列表迭代器。
  • ArrayList al = new ArrayList();
  • //添加元素
  • al.add("java01");
  • al.add("java02");
  • al.add("java03");
  • //在迭代过程中,准备添加或者删除元素。
  • Iterator it = al.iterator(); //传入三个,有三个元素,加入一个元素,迭代器不知道加不加
  • while(it.hasNext())
  • {
  • Object obj = it.next(); //接受一个元素
  • //用迭代器取出元素的同时,用集合的方式在操作元素,这样的并发访问有安全隐患,容易抛出异常
  • if(obj.equals("java02"))
  • //可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作
  • //al.add("java008");
  • it.remove();//将java02的引用从集合中删除了,对象还在内存中,只是集合中没了
  • sop("obj="+obj);
  • }
  • ListIterator li = al.listIterator(); ,对人描述,将数据封装进人对象
  • 2,定义容器,将人存入
  • 3,取出
  • List集合判断元素是否相同,依据是元素的equals方法