第08章集合框架_第1页
第08章集合框架_第2页
第08章集合框架_第3页
第08章集合框架_第4页
第08章集合框架_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章集合框架授课讲师:颜鹏飞本章概述集合也称容器,是装在一组对象的容器,集合框架用来表示和操作集合的一组接口与类。如数组、列表和队列等。集合框架中的常用接口1.java.util.Collection:Collection表示一组对象,这些对象也称为collection的元素。一些collection允许有重复的元素,而另一些则不允许。一些collection是有序的,而另一些则是无序的。JDK不提供此接口的任何直接实现:它提供更具体的子接口(如Set和List)实现。;2.java.util.List:继承Collection,允许重复,以元素安插的次序来放置元素(以元素安插的次序来放置元素:放进去什么样,里边的结构就是什么样),不会重新排列;3.java.util.Set:继承Collcetion,但是不允许重复,使用自己内部的一个排列机制。4.Map:是一组成对的键--值对象,既所持有的是Key-value对。Map中不能有重复的Key,拥有自己的内部排列机制学习集合框架的思路:如何添加元素、如何获得元素、如何删除元素、如何遍历元素。本章目标对象数组集合集合框架(Collection接口,Map接口)Arrays类集合框架接口实现泛型1对象数组在Java提供的存储及随机访问对象序列的各种方法中,数组是效率最高的一种。对象数组数组元素是类的对象所有元素具有相同的类型每个元素都是一个对象的引用1.1对象数组初始化1.静态初始化:在声明和定义数组的同时对数组元素进行初始化,例如:BankAccount[]accounts={newBankAccount(“Zhang",100.00),newBankAccount(“Li",2380.00),newBankAccount(“Wang",500.00),newBankAccount(“Liu",175.56),newBankAccount(“Ma",924.02)};2.动态初始化:使用运算符new,需要经过两步:首先给数组分配空间typearrayName[]=newtype[arraySize];然后给每一个数组元素分配空间arrayName[0]=newtype(paramList);1.2示例:对象数组(一)示例:使用数组存储一个班的学生信息及考试成绩。学生信息包括学号、姓名、二门课(日语、Java)的成绩及总成绩。分析:1.声明学生类Student属性包括学号(id),姓名(name),日语成绩(japScore),java成绩(javaScore),总成绩(sum)方法包括构造方法,get方法,set方法,toString方法,equals方法,compare方法(比较两个学生的总成绩,结果分大于,小于,等于),sumScore方法(计算总成绩)1.2示例:对象数组(二)2.声明学生班级类StudentClass属性包括班级名称(name),容量(capacity),学生(students),实际人数(size)。方法包括构造方法,get方法,set方法,toString方法。1.2.1示例:学生类Student(一)publicclassStudent{ privateStringid; privateStringname; privateintjapScore;//日语成绩 privateintjavaScore;//java成绩 privateintsum; publicStudent(Stringid,Stringname,intjapScore,intjavaScore){ this.id=id; =name; this.japScore=japScore; this.javaScore=javaScore; sumScore(); }

1.2.1示例:学生类Student(二)publicStringgetId(){ returnid;}publicvoidsetId(Stringid){ this.id=id;}………………..publicvoidsumScore(){ this.sum=japScore+javaScore;} publicStringtoString(){ //TODOAuto-generatedmethodstub returngetId()+"\t"+getName()+"\t"+getJapScore()+"\t"+getJavaScore()+"\t"+getSum(); }1.2.1示例:学生类Student(三)//重写equals方法publicbooleanequals(Objectobj){ //TODOAuto-generatedmethodstub if(this.getClass()!=obj.getClass()){ returnfalse; } else{ Studentstudent=(Student)obj; returnthis.getId().equals(student.getId()); }}1.2.1示例:学生类Student(四)//比较规则publicintcompare(Studentstudent){ if(this.getSum()>student.getSum()){ return1; } elseif(this.getSum()==student.getSum()){ return0; } else{ return-1; }}1.2.2示例:班级类StudentClass(一)publicclassStudentClass{ privateStringname;//班级名称 privateintcapacity=40;//班级容量 privateStudentstudents[];//学生 privateintsize;//实际人数

publicStudentClass(Stringname,intsize){ =name; this.size=size; students=newStudent[capacity]; }1.2.2示例:班级类StudentClass(二)publicvoidsetName(Stringname){ =name;}publicStringgetName(){ returnname;}publicvoidsetStudent(Student[]students){ for(inti=0;i<size;i++){ this.students[i]=students[i]; }}…………..1.2.2示例:班级类StudentClass(三)publicStringtoString(){ Stringresult; result="班级:"+name+"\t"+"容量:"+capacity+"\t"+"实际人数:"+size+"\n\n"; result+="学号"+"\t"+"姓名"+"\t"+"日语成绩"+"\t"+"Java成绩"+"\t"+"总成绩"+"\n"; for(inti=0;i<size;i++){ result+=students[i].getId()+"\t"+students[i].getName()+"\t"+students[i].getJapScore()+"\t"+students[i].getJavaScore()+"\t"+students[i].getSum()+"\n"; } returnresult;}1.2.3示例:测试类(一)publicstaticvoidmain(String[]args){ Studentstudents[]; StudentClasssClass=newStudentClass("对日软件开发班",5); students=newStudent[5]; for(inti=0;i<5;i++){ students[i]=getStudent(i+1); } sClass.setStudent(students);

System.out.println(sClass); }1.2.3示例:测试类(二)publicstaticStudentgetStudent(inti){ Scannerscanner=newScanner(System.in); Studentstudent; System.out.println("输入第"+i+"个学生信息"); System.out.println("学号:"); Stringid=scanner.nextLine();//读取键盘输入的一行(以回车换行为结束输入) System.out.println("姓名:"); Stringname=scanner.nextLine(); System.out.println("日语成绩:"); intjapScore=scanner.nextInt(); System.out.println("Java成绩:"); intjavaScore=scanner.nextInt(); student=newStudent(id,name,japScore,javaScore); returnstudent; }1.3.1对象数组--查找方法查找也称为检索,就是从一组数据中找出所需的具有某种特征的数据项。顺序查找对所存储的数据从第一项开始(也可以从最后一项开始),依次与所要查找的数据进行比较,直到找到该数据或将全部元素都找完还没有找到该数据为止。示例:已知学生的学号,查找此学生是否存在。如果存在,返回其在数组中的下标位置;如果不存在,返回-1。publicintfindStudent(Stringid){ for(inti=0;i<size;i++){ if(students[i].getId().equals(id)){returni;} return-1;}}1.3.2对象数组--增加方法在数组的末尾增加一个学生对象。增加之前需先判断数组中是否还有空间,并且在数组中查找将要增加的学号是否已经存在。增加成功,返回true;否则,返回false。

publicbooleanaddStudent(StudentaStudent){if(size==capacity){returnfalse;}if(findStudent(aStudent.getId())>=0){returnfalse;}this.students[size]=aStudent;size++;returntrue;}1.3.3对象数组—删除方法(一)1.已知一个Student对象,将此对象从数组中删除publicbooleandelStudent(StudentaStudent){ intpos=findStudent(aStudent.getId()); if(pos==-1){returnfalse;} for(inti=pos+1;i<size;i++){ {students[i-1]=students[i];} size--; returntrue; }} 1.3.3对象数组—删除方法(二)2.已知学号,删除一个学生publicbooleandelStudent(Stringid){ intpos=findStudent(id); if(pos==-1){returnfalse;} for(inti=pos+1;i<size;i++){ students[i-1]=students[i];} size--; returntrue;}

1.4对象数组—排序1.用选择排序方法按总成绩从高到低排序publicvoidselectionSort(){ Studenttemp; for(inti=0;i<size-1;i++) for(intj=i+1;j<size;j++) if(students[j]pare(students[i])>0){ temp=students[i]; students[i]=students[j]; students[j]=temp; }}1.4对象数组—排序排序前:班级:对日软件开发班容量:40实际人数:5学号姓名日语成绩Java成绩总成绩001张三8790177002李四7865143003王五8664150004赵六9080170005田七4980129排序后:学号 姓名 日语成绩Java成绩 总成绩001 张三 87 90 177004 赵六 90 80 170006 King 78 89 167003 王五 86 64 150002 李四 78 65 143005 田七 49 80 1292集合集合把具有相同性质的一类东西,汇聚成一个整体。在Java2中有很多与集合有关的接口及类。它们被组织在以Collection及Map接口为根的层次结构中,称为集合框架。在Java2之前,在Java1.0/1.1中,没有完整的集合框架。只有一些简单的可以自扩展的容器类VectorHashtable2.1为什么使用集合数组的优点是Java提供的随机访问对象序列的最有效方法。是一个简单的线性序列,访问元素的速度较快。数组的缺点大小自创建以后就固定了,在其整个生存期内其大小不可改变。数组元素只能是同一类型。集合可动态改变其大小。可在序列中存储不同类型的数据。3Java集合框架集合框架(JavaCollectionsFramework)为表示和操作集合而规定的一种统一的标准的体系结构。提供了一些现成的数据结构可供使用,程序员可以利用集合框架快速编写代码,并获得优良性能。包含三大块内容对外的接口:表示集合的抽象数据类型,使集合的操作与表示分开。接口的实现:指实现集合接口的Java类,是可重用的数据结构。对集合运算的算法:是指执行运算的方法,例如在集合上进行查找和排序。3.1Java集合框架(续)——对外的接口集合框架接口声明了对各种集合类型执行的一般操作。包括Collection、Set、List、SortedSet、Map、SortedMap。基本结构如图:3.2Java集合框架——Collection接口包括4个接口、4个抽象类及6个具体类CollectionAbstractCollectionVectorArrayListStackListSetSortedSetAbstractSetAbstractListAbstractSequentialListHashSetTreeSetLinkedList3.2.1Java集合框架——Collection接口1.Collection接口声明了一组操作成批对象的抽象方法:查询方法、修改方法。查询方法intsize()–返回集合对象中包含的元素个数。booleanisEmpty()–判断集合对象中是否还包含元素,如果没有任何元素,则返回true。booleancontains(Objectobj)–判断对象是否在集合中。booleancontainsAll(Collectionc)–判断方法的接收者对象是否包含集合中的所有元素。3.2.1Java集合框架——Collection接口(续)修改方法包括booleanadd(Objectobj)–向集合中增加对象。booleanaddAll(Collectionc)–将参数集合中的所有元素增加到接收者集合中。booleanremove(Objectobj)–从集合中删除对象。booleanremoveAll(Collectionc)-将参数集合中的所有元素从接收者集合中删除。booleanretainAll(Collectionc)–在接收者集合中保留参数集合中的所有元素,其它元素都删除。voidclear()–删除集合中的所有元素。3.2.3Java集合框架——List接口2.List接口扩展了Collection可包含重复元素。元素是有顺序的,每个元素都有一个index值(从0开始)标明元素在列表中的位置。实现List接口的四个主要类是:Vector。ArrayList:一种类似数组的形式进行存储,因此它的随机访问速度极快。LinkedList:内部实现是链表,适合于在链表中间需要频繁进行插入和删除操作。栈Stack。3.2.2Java集合框架——Set、SortedSet接口3.Set接口扩展了Collection。禁止重复的元素,是数学中“集合”的抽象。对equals和hashCode操作有了更强的约定,如果两个Set对象包含同样的元素,二者便是相等的。实现它的两个主要类是哈希集合(HashSet)及树集合(TreeSet)。4.SortedSet接口一种特殊的Set。其中的元素是升序排列的,还增加了与次序相关的操作。通常用于存放词汇表这样的内容。3.2.4Java集合框架——Map、SortedMap接口1.Map接口不是Collection接口的继承。用于维护键/值对(key/valuepairs)。描述了从不重复的键到值的映射,是一个从关键字到值的映射对象。其中不能有重复的关键字,每个关键字最多能够映射到一个值。2.SortedMap接口一种特殊的Map,其中的关键字是升序排列的。与SortedSet对等的Map,通常用于词典和电话目录等。3.2.5Java集合框架——接口实现类接口实现历史集合类SetHashSetTreeSetListArrayListVectorLinkedListStackMapHashMapHashtableTreeMapProperties4.1Arrays类Arrays类Java集合框架提供了一套专门用于操作数组的实用方法,它们作为静态方法存在该类中。常用方法fill(type[]a,typeval):给数组填充,就是简单地把一个数组全部或者某段数据填成一个特殊的值。equals(type[]a,type[]b):实现两个数组的比较,相等时返回true。sort(type[]a):对数组排序。binarySearch(

):对数组元素进行二分法查找。Arrays.asList(Object[]a):实现数组到ArrayList的转换。4.1Arrays类使用数组的填充和复制importjava.util.*;publicclassCopyingArrays{publicstaticvoidmain(String[]args){int[]i=newint[25];int[]j=newint[25];Arrays.fill(i,47);Arrays.fill(j,99);System.arraycopy(i,0,j,0,i.length);int[]k=newint[10];Arrays.fill(k,103);System.arraycopy(i,0,k,0,k.length);Arrays.fill(k,103);System.arraycopy(k,0,i,0,k.length);Integer[]u=newInteger[10];Integer[]v=newInteger[5];Arrays.fill(u,newInteger(47));Arrays.fill(v,newInteger(99));System.arraycopy(v,0,u,u.length/2,v.length);}}4.2Arrays类使用数组的比较importjava.util.*;publicclassComparingArrays{ publicstaticvoidmain(String[]args){ int[]a1=newint[10]; int[]a2=newint[10]; Arrays.fill(a1,47); Arrays.fill(a2,47); System.out.println(Arrays.equals(a1,a2));//true a2[3]=11; System.out.println(Arrays.equals(a1,a2));//false String[]s1=newString[5]; Arrays.fill(s1,"Hi"); String[]s2={"Hi","Hi","Hi","Hi","Hi"}; System.out.println(Arrays.equals(s1,s2));//true }}5Java集合框架接口实现接口的实现Collection没有直接的实现,除Collection以外,其余五个接口都有实现。主要的实现有ListVector/ArrayList/LinkedListSetHashSetSortedSetTreeSetMapHashMapSortedMapTreeMap5.1Java集合框架--List接口实现List接口实现类:Vector/ArrayList/LinkedList能够存储任意对象,但通常情况下,这些不同类型的对象都具有相同的父类或接口。不能存储基本类型(primitive)的数据,除非将这些数据包裹在包装类中。其容量能够根据空间需要自动扩充。增加元素方法的效率较高,除非空间已满,在这种情况下,在增加之前需要先扩充容量。可以在List中间插入和删除元素。Vector:方法是同步的,线程安全。ArrayList/LinkedList:方法是非同步的,效率较高。5.1Java集合框架--List接口实现简述实现操作特性List提供基于索引的对成员的随机访问ArrayList提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好LinkedList对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差5.1.1ArrayList类1.ArrayList类:动态数组,允许快速访问元素,但是从中间插入和删除元素的速度很慢。ArrayList的构造方法ArrayListmyList=newArrayList();ArrayListmyList=newArrayList(intcap);ArrayListmyList=newArrayList(Collectioncol);5.1.1ArrayList类的方法(一)ArrayList类常用方法:(1).voidadd(Objectobj)——添加一个对象,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");(2).booleanaddAll(Collectioncol)——添加整个集合,如果接收者对象的结果有变化,则返回true,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");ArrayListlist=newArrayList();list.addAll(teamList);5.1.1ArrayList类的方法(二)(3).intsize()——返回元素的个数。(4).booleanisEmpty()——如果不含元素,则返回true。(5).Objectget(intpos)——返回指定位置的元素,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.get(1);//返回"LiHong"teamList.get(3);//产生异常ArrayIndexOutOfBoundsException5.1.1ArrayList类的方法(三)(6).voidset(intpos,Objectobj)——用参数对象替换指定位置的对象,如ArrayListteamList=newArrayList();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.set(2,"LiuNa");System.out.println(teamList);//显示[ZhangWei,LiHong,LiuNa]teamList.set(3,"MaLi");//产生例外ArrayIndexOutOfBoundsException5.1.1ArrayList类的方法(四)(7).booleanremove(Objectobj)——去除给定对象的第一次出现,如果找到了对象,则返回true。去除一个对象后,其后面的所有对象都依次向前移动。如ArrayListteamList=newArrayList();

teamList.add("ZhangWei");

teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove("LiHong");teamList.remove("WangHong");//不做任何事,也不出现错误System.out.println(teamList);//显示[ZhangWei,YuHongshu]5.1.1ArrayList类的方法(五)(8).Objectremove(intpos)——去除给定位置的元素,并返回被去除的对象。如ArrayListteamList=newArrayList();

teamList.add("ZhangWei");

teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove(0);//去除ZhangWeiteamList.remove(0);//去除LiHongSystem.out.println(teamList);//显示[YuHongshu]teamList.remove(1);//产生例外ArrayIndexOutOfBoundsException5.1.1ArrayList类的方法(七)(9).booleanremoveAll(Collectioncol)——从接收者对象中去除所有在参数对象中出现的元素,如果接收者对象的结果有变化,则返回true。如ArrayListteamList=newArrayList();

teamList.add("ZhangWei");

teamList.add("LiHong");teamList.add("YuHongshu");ArrayListlist=newArrayList();

list.add("YuHongshu");

list.add("HeLi");list.add("ZhangWei");teamList.removeAll(list);System.out.println(teamList);//显示[LiHong]5.1.1ArrayList类的方法(八)(10).voidclear()——去除所有的元素(11).booleancontains(Objectobj)——返回是否包含指定的对象,如果包含则返回true;否则,返回false(12).booleancontainsAll(Collectioncol)——返回是否包含参数col中的所有对象(13).intindexOf(Objectobj)——返回给定对象在Vector/ArrayList中第一次出现的位置,如不存在,则返回-1。如ArrayListteamList=newArrayList();

teamList.add("ZhangWei");

teamList.add("LiHong");teamList.indexOf("LiHong");//返回1。teamList.indexOf("ZhangLi");//返回-1。5.1.1ArrayList类的方法(九)注意:当使用get()方法取出ArrayList中的元素时,返回的类型都是Object类型。ArrayList的使用者需要记住存入对象的具体类型,当使用get()方法取出后,再塑型成其本来的类型。使用get()方法将Customer对象从ArrayList中取出后,需要再塑型成Customer类。代码如下:for(inti=0;i<v.size();i++){

Customerc=(Customer)v.get(i);

System.out.println(c.getName());}5.1.1Iterator迭代器迭代器(Iterator)本身就是一个对象,它的工作就是遍历并选择集合序列中的对象,而客户端的程序员不必知道或关心该序列底层的结构。此外,迭代器通常被称为.轻量级.对象,创建它的代价小。Iterator接口(1.2版,替代Enumeration)是一个遍历集合元素的工具,是对Enumeration接口的改进,因此在遍历集合元素时,优先选用Iterator接口。与Enumeration不同,具有从正在遍历的集合中去除对象的能力。具有如下三个实例方法,可见相对于Enumeration接口简化了方法名:hasNext()

——判断是否还有元素next()

——取得下一个元素remove()——去除一个元素。注意是从集合中去除最后调用next()返回的元素,而不是从Iterator类中去除5.1.1ListIterator迭代器ListIterator接口继承Iterator接口以支持添加或更改底层集合中的元素,还支持双向访问。方法:hasNext()

——判断后边是否还有元素next()

——取得下一个元素remove()——去除一个元素。注意是从集合中去除最后调用next()返回的元素,而不是从Iterator类中去除add()——向List中添加对象set()——实现对象的修改hasPrevious()——判断前边是否还有元素5.1.1Iterator与ListIterator区别区别:1.ListIterator有add()方法,可以向List中添加对象,而Iterator不能。2.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。3.ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。4.都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。一般情况下,我们使用Iterator就可以了,如果你需要进行记录的前后反复检索的话,你就可以使用ListIterator来扩展你的功能5.1.1案例:使用ArrayList类案例:电影DVD在线销售系统,它需要完成如下功能:1.能够添加n个电影DVD对象,数量不确定,并且能够、修改、删除、查询电影DVD信息。2.能够获取电影DVD对象的总数。3.能够取出电影DVD对象并且逐条打印它的名称。ArrayList类遍历元素的效率比较高存储方式如何选择?元素个数不确定使用集合类需要遍历元素存储对象如何确定?类型:电影DVD对象属性:电影ID、电影名称、电影定价使用ArrayList类(一)第一步:确定集合中要存放的对象。publicclassMovie{privateintmovieId;//电影IdprivateStringmovieName;//电影名称

privatedoubleprice;//电影定价

//构造方法初始化对象

publicMovie(intmovieId,StringmovieName,doubleprice){ this.movieId=movieId; this.movieName=movieName; this.price=price;}//getter、setter方法……… }使用ArrayList类(二)第二步:操作集合中存放的对象。//显示电影DVD列表publicstaticvoidshowMovieDvdList(){}//添加电影DVD信息publicstaticvoidaddMovieDvd(){}//修改电影DVD信息publicstaticvoideditMovieDvd(){}//修改电影DVD信息publicstaticvoiddeleteMovieDvd(){}//查询电影DVD信息publicstaticvoidqueryMovieDvd(){}5.1.2LinkedList类LinkedList类是List接口的一个具体实现类。LinkedList类用于创建链表数据结构。插入或者删除元素时,它提供更好的性能。addFirst方法添加销售冠军电影DVD对象addLast方法添加销售最后一名的电影DVD对象getFirst方法获取销售冠军电影DVD对象getLast方法获取销售最后一名的电影DVD对象removeFirst方法删除销售冠军电影DVDremoveLast方法删除销售最后一名的电影DVD案例:使用LinkedList类继续分析案例:电影DVD在线销售系统需要增加新的功能,如下:能够添加销售冠军电影DVD对象能够删除销售最后一名的电影DVD对象存储方式如何选择?元素个数不确定使用集合类需要在列表的头或尾添加、删除元素LinkedList提供额外的方法在列表的首部或尾部添加或删除元素。案例:使用LinkedList类addFirst方法添加销售冠军电影DVD对象addLast方法添加销售最后一名的电影DVD对象getFirst方法获取销售冠军电影DVD对象getLast方法获取销售最后一名的电影DVD对象removeFirst方法删除销售冠军电影DVDremoveLast方法删除销售最后一名的电影DVD5.2Java集合框架--Map接口实现Map接口以该接口为根的集合类,用于存储“关键字”(key)和“值”(value)的元素对,其中每个关键字映射到一个值。当需要通过关键字实现对值的快速存取时使用。声明的抽象方法主要有查询方法修改方法两个主要实现类HashTable(1.0)HashMap(1.2)5.2Java集合框架--Map接口实现简述实现操作特性成员要求Map保存键值对成员,基于键找值操作,使用compareTo或compare方法对键进行排序HashMap能满足用户对Map的通用需求键成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。TreeMap支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap;附加实现SortedMap接口,支持子Map等要求顺序的操作键成员要求实现Comparable接口,或者使用Comparator构造TreeMap键成员一般为同一类型。LinkedHashMap保留键的插入顺序,用equals方法检查键和值的相等性成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修hashCode方法。5.2.1Java集合框架--查询方法查询方法intsize()——返回Map中的元素个数booleanisEmpty()——返回Map中是否包含元素,如不包括任何元素,则返回truebooleancontainsKey(Objectkey)——判断给定的参数是否是Map中的一个关键字(key)booleancontainsValue(Objectval)——判断给定的参数是否是Map中的一个值(value)Objectget(Objectkey)——返回Map中与给定关键字相关联的值(value)Collectionvalues()——返回包含Map中所有值(value)的Collection对象SetkeySet()——返回包含Map中所有关键字(key)的Set对象SetentrySet()——返回包含Map中所有项的Set对象5.2.2Java集合框架--修改方法修改方法Objectput(Objectkey,Objectval)——将给定的关键字(key)/值(value)对加入到Map对象中。其中关键字(key)必须唯一,否则,新加入的值会取代Map对象中已有的值。voidputAll(Mapm)——将给定的参数Map中的所有项加入到接收者Map对象中。Objectremove(Objectkey)——将关键字为给定参数的项从Map对象中删除。voidclear()——从Map对象中删除所有的项。5.2.3Java集合框架Map接口实现

–HashTable,HashMap哈希表也称为散列表,是用来存储群体对象的集合类结构,其两个常用的类是HashTable及HashMap。哈希表存储对象的方式与前面所讲的数组,Vector及ArrayList不同。数组,Vector及ArrayList中对象的存储位置是随机的,即对象本身与其存储位置之间没有必然的联系。因此查找一个对象时,只能以某种顺序(如顺序查找,二分查找)与各个元素进行比较,如果数组或向量中的元素数量很庞大时,查找的效率必然降低。哈希表中,对象的存储位置和对象的关键属性k之间有一个特定的对应关系f,我们称之为哈希(Hash)函数。它使每个对象与一个唯一的存储位置相对应。因而在查找时,只要根据待查对象的关键属性k,计算f(k)的值即可知其存储位置。5.2.3Java集合框架Map接口实现

–HashTable,HashMap哈希表相关的一些主要概念容量(capacity)——哈希表的容量不是固定的,随对象的加入,其容量可以自动扩充。关键字/键(key)——每个存储的对象都需要有一个关键字key,key可以是对象本身,也可以是对象的一部分(如对象的某一个属性)。哈希码(hashcode)——要将对象存储到HashTable,就需要将其关键字key映射到一个整型数据,称为key的哈希码(hashcode)。哈希函数(hashfunction)——返回对象的哈希码。项(item)——哈希表中的每一项都有两个域:关键字域key及值域value(即存储的对象)。key及value都可以是任意的Object类型的对象,但不能为空(null),HashTable中的所有关键字都是唯一的。装填因子(loadfactor)——(表中填入的项数)/(表的容量)。5.2.3Java集合框架Map接口实现

–HashTable,HashMapObjectget(Objectkey)——返回关键字为key的值value,如果不存在,则返回null。如Hashtable

aPhoneBook=newHashtable();aPhoneBook.put("ZhangLei","");aPhoneBook.put("ZhuYongqin","");aPhoneBook.get("ZhangLei");//返回""aPhoneBook.get("ZhuYongqin");//返回""aPhoneBook.get("LiuLing");//返回nullObjectremove(Objectkey)——将键/值对从表中去除,并返回从表中去除的值,如果不存在,则返回null。如Hashtable

aPhoneBook=newHashtable();aPhoneBook.put("ZhuYongqin","");aPhoneBook.put("LiuNa","");aPhoneBook.remove("ZhuYongqin");aPhoneBook.remove("");//不出错,但返回nullSystem.out.println(aPhoneBook);//显示{LiuNa=}5.2.3Java集合框架Map接口实现

–HashTable,HashMapbooleanisEmpty()——判断哈希表是否为空。booleancontainsKey(Objectkey)——判断给定的关键字是否在哈希表中。booleancontains(Objectvalue)——判断给定的值是否在哈希表中。booleancontainsValue(Objectvalue)——判断给定的值是否在哈希表中。voidclear()——将哈希表清空。Enumerationelements()——返回包含值的Enumeration对象。SetkeySet():返回所有的键(key),并使用Set容器存放。SetentrySet():返回一个实现Map.Entry接口的元素Set。Collectionvalues():返回所有的值。HashMap类与HashTable类很相似,只是HashTable类不允许有空的关键字,而HashMap类允许。5.2.3Java集合框架Map接口实现

–HashTable与HashMap区别HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。3.HashTable有一个contains(Objectvalue),功能和containsValue(Objectvalue)功能一样。4.HashTable使用Enumeration,HashMap使用Iterator。5.2.3Java集合框架Map接口实现

–HashTable,HashMap遍历HashMap:第一种:效率高,以后一定要使用此种方式!Mapmap=newHashMap();Iteratoriter=map.entrySet().iterator();while(iter.hasNext()){Map.Entryentry=(Map.Entry)iter.next();Objectkey=entry.getKey();Objectval=entry.getValue();}第二种:效率低,以后尽量少使用!Mapmap=newHashMap();Iteratoriter=map.keySet().iterator();while(iter.hasNext()){Objectkey=iter.next();Objectval=map.get(key);}5.2.3案例:HashMap电影DVD在线销售系统中,每一部电影都会属于一种电影分类,一种电影分类包含N部电影。科幻电影阿凡达、暮光之城恐怖电影贞子缠身、咒怨现在希望根据电影分类查询关联的影片集合,如何实现?存储方式如何选择?元素个数不确定使用集合类通过key(电影分类)获得value(电影集合)HashMap是Map接口的实现类,把各个Object映射起来,实现了“键/值(key/value)”对应的快速存取。5.2.4Comparable接口TreeMap中是根据键(Key)进行排序的。而如果我们要使用TreeMap来进行正常的排序的话,Key中存放的对象必须实现Comparable接口。在java.lang包中,Comparable接口适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许您把集合排序成自然顺序。它只有一个方法:compareTo()方法,用来比较当前实例和作为参数传入的元素。如果排序过程中当前实例出现在参数前(当前实例比参数大),就返回某个负值。如果当前实例出现在参数后(当前实例比参数小),则返回正值。否则,返回零。如果这里不要求零返回值表示元素相等。零返回值可以只是表示两个对象在排序的时候排在同一个位置。5.2.5Comparator接口Java.util包中提供的一个对某个对象集合进行整体排序的比较接口提供了compare的比较方法来比较对象使用方法:定义实现该接口的类,重写compare方法;实例化该类的对象;把该对象作为Collections.sort()方法的参数。5.2.5Comparator接口//实现Comparator接口,比较DVD的价格publicclasspareimplementsComparat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论