1、课程名称:类集框架2、知识点2.1、上次课程的主要知识点1、File类操作文件:构造方法、exists()、delete()、mkdirs()、getParentFile();2、InputStream和OutputStream使用的文件拷贝程序;3、输出数据使用打印流、输入数据使用Scanner(BufferedReader);4、对象如果需要传输,则对象所在的类必须实现java.io.Serializable接口,这个接口没有方法。2.2、本次预计讲解的知识点1、类集简介;2、类集之中的核心操作接口以及核心代码的使用。3、具体内容3.1、认识类集(理解)如果现在要想保存多个对象,肯定使用对象数组完成,但是对象数组本身有一个最大的问题在于其数据的长度,所以后来使用了链表完成了动态对象数组的开发,可是链表的开发难度实在是很大,而且如果一个链表要想真正去使用,只依靠之前所编写的还不够,还需要进行一些代码的调优。而在JDK1.2之后正式引入了类集的概念,类集是一种动态的对象数组,属于各个数据结构的实现类,在整个类集之中主要的组成是一些核心的操作接口:Collection、List、Set、Map、Iterator、Enumeration。3.2、单值保存的最大父接口:Collection(重点)所谓的单值保存指的是每一次操作只会保存一个对象,就好像之前的链表程序一样,每一次只保存了一个对象,在Collection接口之中定义了如下的一些操作方法。NO.方法名称类型描述1publicbooleanadd(Ee)普通数据增加2publicvoidclear()普通清除数据3publicbooleancontains(Objecto)普通查找数据是否存在4publicbooleanisEmpty()普通判断是否为空集合5publicIteratorEintegrator()普通为Iterator接口实例化6publicbooleanremove(Objecto)普通删除数据7publicintsize()普通取得集合的个数8publicObject[]toArray()普通将集合变为对象数组在Collection接口之中一共定义了15个方法,在所有的方法之中,只有两个方法最为常用:add()、interator()。不过从开发上讲,很少会去直接使用Collection,都会使用Collection的两个子接口:List、Set。3.3、允许重复的子接口:List(重点,80%)List是Collection的一个最为常用的子接口,首先这个接口的定义如下:publicinterfaxeListEextendsCollectionE但是List接口对Collection接口进行了大量的扩充,但是扩充之后的主要方法:NO.方法名称类型描述1publicEget(intindex)普通取得指定索引位置上的数据2publicEset(intindex,Eelement)普通修改指定索引位置上的数据3publicListIteratorElistIterator()普通为ListIterator接口实例化但是以上的三个方法,只针对于List接口起作用,而List接口有两个常用子类:ArrayList、Vector。3.3.1、新的子类:ArrayList(95%)ArrayList是List子接口使用最多的一个子类,而这个类的定义如下:publicclassArrayListEextendsAbstractListEimplementsListE,RandomAccess,Cloneable,Serializable按照面向对象的概念来讲,现在使用ArrayList主要的目的是为List接口实例化,所有的操作方法都以List接口为主。范例:使用ArrayList进行List接口的功能验证。packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;publicclassTestDemo{publicstaticvoidmain(String[]args)throwsException{ListStringall=newArrayListString();all.add(Hello);all.add(Hello);//内容重复了all.add(World);for(intx=0;xall.size();x++){Stringstr=all.get(x);//get()方法只有List接口有System.out.print(str+、);}}}在使用代码的时候可以发现,List集合之中即使存在了重复数据,也可以正常的保存,而且数据保存的顺序就是存入数据的顺序。范例:使用List集合修改之前的程序packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;interfaceAnimal{//动物publicStringgetName();publicintgetAge();}classZoo{privateListAnimalanimals=newArrayListAnimal();//多个动物publicvoidadd(Animalani){//增加动物this.animals.add(ani);}publicvoiddelete(Animalani){this.animals.remove(ani);//需要equals()}publicListAnimalsearch(StringkeyWord){ListAnimalresult=newArrayListAnimal();Objectobj[]=this.animals.toArray();for(intx=0;xthis.animals.size();x++){Animalani=this.animals.get(x);if(ani.getName().contains(keyWord))//满足{//满足result.add(ani);}}returnresult;}}classDogimplementsAnimal{privateStringname;privateintage;publicDog(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}publicbooleanequals(Objectobj){if(this==obj){returntrue;}if(obj==null){returnfalse;}if(!(objinstanceofDog)){returnfalse;}Dogdog=(Dog)obj;if(this.name.equals(dog.name)&&this.age==dog.age){returntrue;}returnfalse;}publicStringtoString(){return【狗的信息】名字:+this.name+,年龄:+this.age;}}classTigerimplementsAnimal{privateStringname;privateintage;publicTiger(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}publicbooleanequals(Objectobj){if(this==obj){returntrue;}if(obj==null){returnfalse;}if(!(objinstanceofTiger)){returnfalse;}Tigert=(Tiger)obj;if(this.name.equals(t.name)&&this.age==t.age){returntrue;}returnfalse;}publicStringtoString(){return【老虎的信息】名字:+this.name+,年龄:+this.age;}}classTestDemo{publicstaticvoidmain(String[]args){Zoozoo=newZoo();//动物园zoo.add(newDog(花狗,1));zoo.add(newDog(黄狗,1));zoo.add(newDog(黑狗,1));zoo.add(newDog(斑点狗,1));zoo.add(newTiger(斑点虎,2));zoo.add(newTiger(黑虎,2));zoo.add(newTiger(花虎,2));zoo.delete(newDog(斑点狗,1));//删除ListAnimalresult=zoo.search(斑点);for(intx=0;xresult.size();x++){System.out.println(result.get(x));}}}至少此时的程序不再需要自己去开发链表了,所有的链表的实现类都有了。3.3.2、旧的子类:Vector(5%)Vector类是在JDK1.0的时候就推出的一个最早的实现动态数组的操作类,实际上对于今天而言,有许多的类上依然还是在使用着Vector,不过从实际的开发来讲,现在设计的一些程序都是针对于接口的操作了。packagecn.mldn.demo;importjava.util.List;importjava.util.Vector;publicclassTestDemo{publicstaticvoidmain(String[]args)throwsException{ListStringall=newVectorString();all.add(Hello);all.add(Hello);//内容重复了all.add(World);for(intx=0;xall.size();x++){Stringstr=all.get(x);//get()方法只有List接口有System.out.print(str+、);}}}因为所有的操作都是针对于接口完成的,接口定义的方法不变,子类随便变。面试题:请解释ArrayList和Vector的区别?No.区别ArrayListVector1推出时间JDK1.2JDK1.02性能采用异步处理方式,性能更高采用同步处理方式,性能相对较低3安全性非线程安全线程安全4输出Iterator、ListIterator、foreachIterator、ListIterator、foreach、Enumeration从实际开发而言,几乎都是开发异步程序,所以首选的肯定是ArrayList子类。3.4、不允许重复的子接口:Set(重点,20%)Set也是一个Collection较为常用的子接口,这个接口的定义如下:publicinterfaceSetEextendsCollectionE在Collection接口定义了15个方法,但是Set子接口并不像List子接口那样对Collection接口进行了大量的扩充,而是完整的继承了下来,那么就证明了在Set子接口之中是肯定无法使用get()方法的。那么在Set子接口之中常用的两个子类:HashSet、TreeSet,下面分别说明。3.4.1、散列存在的子类:HashSet(80%)Hash(哈希)属于一种算法,这种算法的核心意义指的是找空保存算法,所以只要一看见hash第一反应就是说没有顺序的保存。范例:观察Set接口使用packagecn.mldn.demo;im