教学目标了解集合框架的接口以及实现类。掌握ArrayList、Vector以及HashMap等常见集合实现类的用法。了解如何利用泛型存取数据。集合集合:类似于数组,是存放对象的聚集。集合对象中存放的是一组对象。换句话说,集合中的存放的元素是对象。集合中接口决定了集合API中各个类的基本特性。具体类仅仅是提供了标准接口的不同实现。集合API中的接口和类主要位于java.util包中;最基本的接口是Collection接口,该接口定义了操作数据的基本方法.位于集合框架层次结构顶层的Collection接口是集合框架的基础,它声明了所有集合类都有的核心方法。Collection接口有2个直接扩展的子接口:List和Set。不按顺序保存元素,不可重复按顺序保存元素,可重复集合框架中的实现类Collection接口Collection接口重要的方法有:publicbooleanadd(Objectobj);//将对象obj加入到当前集合对象中publicbooleanaddAll(Collectionc);//将集合c中的元素加入到当前集合对象中publicvoidclear();//清除当前集合中的所有元素publicbooleancontains(Objectobj);//判断当前集合中是否包含obj对象publicIteratoriterator();//得到当前集合的迭代器publicbooleanremove(Objectobj);//删除当前集合中的obj对象publicintsize();//得到当前集合中元素的总数publicbooleanisEmpty();//判断当前集合是否为空publicObject[]toArray();//将当前集合对象转化成对象数组注意:集合类中的许多方法的参数都是Object类型。Set接口Set中的元素必须唯一。不允许有重复的元素。不重复是指集合中任意2个对象x和y,x.equals(y)始终为false。4627351实现了Set接口的类主要有:AbstractSet:所有Set的实现类都直接或者间接继承AbstractSet父类。HashSet:内部使用一个哈希表来实现Set集合,并允许存放null元素。不保证元素的排列顺序,顺序有可能发生变化。在编程中常常使用该类。LinkedHashSet:既有HashSet的查询速度,又能保存元素被加进去的顺序去(插入顺序)。HashSetHashSet的构造函数如下:HashSet()//构造一个空set。HashSet(Collectionc)//构造一个包含指定collection中的元素的新set。例:SetDemo.java注意:输出结果中集合里的元素没有按照顺序排序。既没有按照输入顺序,也没有按照自然顺序。输出结果中没有重复元素。如字符串3就没有重复的。但是1有重复的,原因是这里的1是2个对象,字符串型的和基本数据类型的包装类Integer类型的。基本数据类型要插入进去需要使用我们上节课介绍的基本数据类型的包装类。向上转型的好处:如果以后我们不用HashSet,改用LinkedHashSet或其他,那么我们只需要将如下语句:Setset=newHashSet();改为:Setset=newLinkedHashSet();实现改变了,编程改动的工作量较小。应当培养这种良好的面向对象的编程习惯。Set接口有一个子接口SortedSet,SortedSet中的元素可以保证处于排序状态,一个直接应用类TreeSet。例:treesetDemo.javaList接口List接口定义了一个有序的对象集合,允许重复元素存在。List类似于动态数组或变长数组。List中存放的元素的数量(List的容量)可以随着插入操作自动进行调整。2114List(列表)3210除了从Collection接口中继承的方法外,List接口新增了如下一些方法:publicvoidadd(intindex,Objectobj);//在当前List中的index位置插入obj对象publicbooleanaddAll(intindex,Colletionc);//将集合c中的全部元素添加到从index开始往后的当前集合中publicObjectset(intindex,Objectobj);//将index指示的位置的元素用obj替换publicObjectget(intindex);//返回index位置的元素publicObjectremove(intindex);//删除index位置的元素publicintindexOf(Objecto);//返回o在List中的第一次出现的位置,List中o不存在返回-1publicintlastIndexOf(Objecto);//返回o在List中最后一次出现的位置,List中o不存在返回-1publicListsubList(intfromIndex,inttoIndex);//得到一个从fromIndex开始到toIndex处(不含此处)的当前List的一个子集publicListIteratorlistIterator();//返回列表中元素的列表迭代器(以正确的顺序)publicListIteratorlistIterator(intindex);//从列表的指定位置index开始,返回列表中元素的列表迭代器(以正确的顺序)实现了List接口的2个类:ArrayList和Vector类,在实际中经常使用。例:ListDemo.java注意:放入的顺序==出来的顺序可存放重复类型的对象remove()方法可删除某位置的对象,也可删除某一个对象。ArrayList与Vector的区别1.同步性:Vector是同步的,并且是线程安全的。ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。ArrayList执行的效率比Vector要高。2.数据增长:增加元素的时候,若元素的数目超出了数组长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势。Iterator接口Iterator接口主要用来遍历集合中的元素。在实际应用中只要用到Collection接口的类都会用到iterator这个接口,所有实现Collection接口的类都有一个iterator()方法,用来返回一个实现Iterator接口的对象。作用是对Collection的元素进行遍历等操作只能单向移动。有3个主要方法:publicbooleanhasNext();//判断集合中是否还有元素publicObjectnext();//得到下一个元素publicvoidremove();//从集合中删除当前元素例:IteratorDemo.javaListIterator接口是Iterator接口的子接口,它针对List集合有序的特点,提供了双向检索和元素存取的功能。主要方法有:publicbooleanhasPrevious();//如果以反向遍历列表,列表迭代器有多个元素,则返回truepublicObjectprevious();//返回列表中的前一个元素publicvoidadd(Objecto);//将指定的元素插入列表(在当前位置插入)publicvoidset(Objecto);//用指定元素替换next或previous返回的最后一个元素(可选操作)例:ListIteratorDemo.java遍历集合的方法数组遍历voidenumerate(Collectionlist){for(inti=0;ilist.size();i++)Objecto=list.get(i);}遍历集合的方法迭代器遍历(所有实现了Iterable接口的集合类)Iteratorit=list.iterator();while(it.hasNext()){System.out.println(it.next());}判断该迭代器中是否还有元素需要迭代,返回true或false返回迭代的下一个元素,指针下移for-each形式所有利用迭代器迭代的元素都可以用for-each形式。for(Objectob:list){System.out.println(ob);}从哪个集合对象中取元素形参名形参数据类型Map接口Collection接口表示的是单一对象的集合;即每个位置保存的是单一的对象Map中保存关键字-值这种形式的对象。关键字值身份证号简介信息国家的英文国家的中文方法:publicSetkeySet();//返回此映射中包含的键的set视图publicColletionvalues();//返回此映射中包含的值的collection视图publicSetentrySet();//返回此映射中包含的映射关系的set视图,即返回的Set中包含了Map中所有的关键字-值对Key集合Value集合Entry集合KeyObject1KeyObject2KeyObject3。。。ValueObject1ValueObject2ValueObject3。。。Map中还定义了对Map数据集合的操作方法:publicvoidclear();//清空整个集合publicObjectget(Objectobj);//根据关键字obj得到对应的值publicObjectput(Objectkey,Objectvalue);//将键-值对加入到当前的Map中publicvoidremove(Objectkey);//从当前Map中删除key代表的键-值对实现了Map接口的类中常用的是HashMap和HashTableHashTable是线程访问安全的HashTable的子类Properties:Properties的关键字和值只能是String;Properties经常用来读取配置信息。HashMap:实现Map接口,存储键/值映射关系,不能保证其元素的存储顺序,即不保证放入与取出的顺序一致。HashMap此类的构造方法包括:它在存放键/值时允许值为null值构造方法说明HashMap()创建一个具有默认容量和负载系数的空映射HashMap(intsize)创建一个具有指定大小的容量和默认负载系数的空映射HashMap(intsize,floatload)创建一个具有指定的容量和指定的负载系数的空映射HashMap(Mapmap)创建一个具有指定map映射的散列映射示例:MapDemo.javaStudentMapDemo.java泛型泛型:编译期用来检查输入集合中数据的类型,从而避免操作时强制类型转换。例如:ListStringls=newArrayListString();ls.add(“a1”);ls.add(2);//报错//取元素时不用再强制类型转换,因为强制类型转换会出错for(Stringstr:ls){System.out.println(str);}IteratorStringit=ls.iterator();while(it.hasNext()){System.out.println(it.next().getName());}从ls中取元素付给形参strHashmap中也可使用泛型MapString,Studentmp=newHashMapString,Student();SetStringset=mp.keySet();IteratorStringit=set.iterator();while(it.hasNext()){System.out.println(mp.get(it.next()).getName());}作业定义学生信息实体类stud