第章对象群体的组织_第1页
第章对象群体的组织_第2页
第章对象群体的组织_第3页
第章对象群体的组织_第4页
第章对象群体的组织_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

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

文档简介

第七章对象群体的组织JAVA语言程序设计1目录7.1对象数组7.3集合(Collection,Map)7.4本章小结27.1对象数组数组在Java提供的存储及随机访问对象序列的各种方法中,数组是效率最高的一种类型检查边界检查优点数组知道其元素的类型编译时的类型检查大小已知代价数组对象的大小是固定的,在生存期内大小不可变3对象数组数组元素是类的对象所有元素具有相同的类型每个元素都是一个对象的引用对象数组7.1对象数组(续)4静态初始化:在声明和定义数组的同时对数组元素进行初始化,例如:BankAccount[]accounts={newBankAccount(“Zhang",100.00),newBankAccount(“Li",2380.00),newBankAccount(“Wang",500.00),newBankAccount(“Liu",175.56),newBankAccount(“Ma",924.02)};动态初始化:使用运算符new,需要经过两步:首先给数组分配空间typearrayName[]=newtype[arraySize];然后给每一个数组元素分配空间arrayName[0]=newtype(paramList);…arrayName[arraySize-1]=newtype(paramList);7.1.1用数组存储对象(续)

——对象数组的初始化对象数组5使用数组存储一个班的学生信息及考试成绩。学生信息包括学号、姓名、三门课(英语、数学、计算机)的成绩及总成绩。首先声明学生类Student属性包括学号(id),姓名(name),英语成绩(eng),数学成绩(math),计算机成绩(comp),总成绩(sum)方法包括构造方法,get方法,set方法,toString方法,equals方法,compare方法(比较两个学生的总成绩,结果分大于,小于,等于),sum方法(计算总成绩)实现Serializable接口,以便对象持久化,7.1.1用数组存储对象(续)

——例7_1对象数组6importjava.io.*;publicclassStudentimplementsSerializable{ privateStringid; //学号

privateStringname; //姓名

privateinteng; //英语成绩

privateintmath; //数学成绩

privateintcomp;//计算机成绩

privateintsum; //总成绩

publicStudent(Stringid,Stringname,inteng,intmath,intcomp){ this.id=id; =name; this.eng=eng; this.math=math; p=comp; sum();//计算总成绩 }

7.1.1用数组存储对象(续)

——例7_1对象数组7 publicStudent(Students){ this.id=s.id; =newString(); this.eng=s.eng; this.math=s.math; p=p; sum();//计算总成绩 }

publicvoidsetId(Stringid){ this.id=id; } publicvoidsetName(Stringname){ =name; }

7.1.1用数组存储对象(续)

——例7_1对象数组8 publicvoidsetEng(inteng){ this.eng=eng; sum();//计算总成绩 }

publicvoidsetMath(intmath){ this.math=math; sum();//计算总成绩 }

publicvoidsetComp(intcomp){ p=comp; sum();//计算总成绩 }

publicStringgetId(){ returnid; }

7.1.1用数组存储对象(续)

——例7_1对象数组9 publicStringgetName(){ returnname; } publicintgetEng(){ returneng; } publicintgetMath(){ returnmath; } publicintgetComp(){ returncomp; } publicintgetSum(){ returnsum; }

voidsum(){ this.sum=eng+math+comp; }

7.1.1用数组存储对象(续)

——例7_1对象数组10publicStringtoString(){returngetId()+"\t"+getName()+"\t"+getEng()+"\t"+getMath()+"\t"+getComp()+"\t"+getSum();}publicbooleanequals(Objectx){if(this.getClass()!=x.getClass())returnfalse;Studentb=(Student)x;return(this.getId().equals(b.getId()));}//比较成绩大小小,当前对象象成绩比参数数对象成绩大大时返回1,相等时返回回0,其它返返回-1.publicintcompare(StudentA){if(this.getSum()>A.getSum())return1;elseif(this.getSum()==A.getSum())return0;elsereturn-1;}}用用数组存储储对象(续)——例7_1对象数组11下面声明班级级类StudentClass:属性包括班级名称(name),,容量(capacity),学生(students),实际人数(size)。。方法包括构造方法,get方法,set方法,toString方法。publicclassStudentClass{privateStringname;//班级名称staticintcapacity=40;//最大容量privateStudentstudents[];//学生privateintsize;//实际人数用用数组存储储对象(续)——例7_1对象数组12publicStudentClass(Stringname,intsize){=name;this.size=size;students=newStudent[capacity];}publicStringgetName(){returnname;}publicintgetCapacity(){returncapacity;}publicStudent[]getStudents(){returnstudents;}用用数组存储储对象(续)——例7_1对象数组13publicintgetSize(){returnsize;}publicvoidsetName(Stringname){=name;}publicvoidsetCapacity(intcapacity){this.capacity=capacity;}publicvoidsetSize(intsize){this.size=size;}publicvoidsetStudents(Student[]students){for(inti=0;i<size;i++)this.students[i]=newStudent(students[i]);}用用数组存储储对象(续)——例7_1对象数组14publicStringtoString(){Strings;s="班级:"+name+"\t"+"容量:"+capacity+"\t"+"实际人数:"+size+"\n\n";s=s+“学号”+“\t”+““姓名”+“\t”+““英语”+“\t”+““数学”+“\t”+“计算机”+"\t"+"总成绩\n";for(inti=0;i<size;i++)s=s+students[i].getId()+"\t"+students[i].getName()+"\t"+students[i].getEng()+"\t"+students[i].getMath()+"\t"+students[i].getComp()+"\t"+students[i].getSum()+"\n";returns;}}用用数组存储储对象(续)——例7_1对象数组15下面声明测试试类Tester1(其中Keyboard类的声明见第第3章例3-12),为为测试简单,,仅生成具有有5名学生的的班级,5名名学生的信息息从键盘输入入,为了避免免以后再重复复输入,可将将输入的学生生信息保存到到文件中importjava.io.*;publicclassTester1{publicstaticvoidmain(Stringargs[]){Studentstudents[];StudentClassaClass=newStudentClass("软件0201",5);students=newStudent[5];for(inti=0;i<5;i++)students[i]=newStudent(getAStudent(i+1));aClass.setStudents(students);System.out.println(aClass);用用数组存储储对象(续)——例7_1对象数组16//将学生信息保保存到文件stu.ser中。try{FileOutputStreamfo=newFileOutputStream("stu.ser");ObjectOutputStreamso=newObjectOutputStream(fo);for(inti=0;i<5;i++)so.writeObject(students[i]);so.close();}catch(Exceptione){System.out.println(e);}}用用数组存储储对象(续)——例7_1对象数组17publicstaticStudentgetAStudent(inti){Studentstudenti;System.out.println("输入第"+i+"个学生的信息息:");System.out.print("学号:");Stringid=Keyboard.getString();System.out.print("姓名:");Stringname=Keyboard.getString();System.out.print("英语成绩:");inteng=Keyboard.getInteger();System.out.print("数学成绩:");intmath=Keyboard.getInteger();System.out.print("计算机成绩:");intcomp=Keyboard.getInteger();studenti=newStudent(id,name,eng,math,comp);returnstudenti;}}用用数组存储储对象(续)——例7_1对象数组18运行结果如下下(其中学生生信息的输入入只显示一部部分):输入第1个学学生的信息:学号:250201姓名:李红英语成绩:88数学成绩:76计算机成绩:60输入第2个学学生的信息:……班级:软件0201容容量:40实际际人数:5学号姓姓名英英语数数学计计算算机总成成绩250201李红887660224250202张林786780225250203董玉梅梅868075241250204张张力706875213250205何何为809078248用用数组组存储储对象象(续续)——例例7_1运运行结结果对象数数组19查找也称为为检索索,就就是从从一组组数据据中找找出所所需的的具有有某种种特征征的数数据项项顺序查查找对所存存储的的数据据从第第一项项开始始(也也可以以从最最后一一项开开始)),依依次与与所要要查找找的数数据进进行比比较,,直到到找到到该数数据或或将全全部元元素都都找完完还没没有找找到该该数据据为止止用用数组组存储储对象象(续续)——为为班级级类添添加查找方法对象数数组20已知学学生的的学号号,查查找此此学生生是否否存在在。如如果存存在,,返回回其在在数组组中的的下标标位置置;如如果不不存在在,返返回-1。顺序序查找找方法法的代代码如如下publicintfind(Stringid){for(inti=0;i<size;i++)if(students[i].getId().equals(id))returni;return-1;}用用数组组存储储对象象(续续)——为为班级级类添添加查找方法对象数数组21在数组组的末末尾增增加一一个学学生对对象增加之之前需需先判判断数数组中中是否否还有有空间间,并并且在在数组组中查查找将将要增增加的的学号号是否否已经经存在在增加成成功,,返回回true;否则则,返返回falsepublicbooleanadd(StudentaStudent){if(size==capacity)returnfalse;if(find(aStudent.getId())>=0)returnfalse;this.students[size]=newStudent(newString(aStudent.getId()),newString(aStudent.getName()),aStudent.getEng(),aStudent.getMath(),aStudent.getComp());size++;returntrue;}用用数数组组存存储储对对象象(续续)———为为班班级级类类添添加加增加加方法法对象象数数组组22已知知一一个个Student对象象,,将将此此对对象象从从数数组组中中删删除除publicbooleandel(StudentaStudent){intpos=find(aStudent.getId());if(pos==-1)returnfalse;for(inti=pos+1;i<size;i++)students[i-1]=students[i];size--;returntrue;}用用数数组组存存储储对对象象(续续)———为为班班级级类类编编写写删除除方法法对象象数数组组23已知知学学号号,删除除一一个个学学生生publicbooleandel(Stringid){intpos=find(id);if(pos==-1)returnfalse;for(inti=pos+1;i<size;i++)students[i-1]=students[i];size--;returntrue;}用用数数组组存存储储对对象象(续续)———为为班班级级类类添添加加删除除方法法对象象数数组组24对对数数组组元元素素进进行行排排序序排序序按照照预预先先规规定定的的准准则则((如如升升序序或或降降序序等等)),,把把数数据据有有次次序序地地排排列列起起来来已经设计计出许多多排序算算法,常常用的排排序算法法有选择排序序插入排序序交换排序序以降序为为例进行行介绍对象数组组25选择排序序的基本本思想先在未排排序序列列中选一一个最小小元素,,作为已已排序子子序列然后再重重复地从从未排序序子序列列中选取取一个最最小元素素,把它它加到已已经排序序的序列列中,作作为已排排序子序序列的最最后一个个元素直到把未未排序子子序列中中的元素素处理完完为止对对数组元元素进行行排序(续)——选择择排序对象数组组26用选择排排序方法法将例7-1中中生成的的文件stu.ser中的班级级学生按按总成绩绩从高到到低排序序在例7-1中的的StudentClass类中增加加选择排排序方法法selectionSort,代码如下下publicvoidselectionSort(){Studenttemp;for(inti=0;i<size-1;i++)for(intj=i+1;j<size;j++)if(students[j].compare(students[i])>0){temp=students[i];students[i]=students[j];students[j]=temp;}}对对数组元元素进行行排序(续)——例7_2对象数组组27测试类代代码如下下importjava.io.*;publicclassSortTester{publicstaticvoidmain(Stringargs[]){Studentstudents[]=newStudent[5];//从文件stu.ser中读出学学生信息息try{FileInputStreamfi=newFileInputStream("stu.ser");ObjectInputStreamsi=newObjectInputStream(fi);for(inti=0;i<5;i++)students[i]=(Student)si.readObject();si.close();}catch(Exceptione){System.out.println(e);}对对数组元元素进行行排序(续)——例7_2对象数组组28StudentClassaClass=newStudentClass("软件0201",5);aClass.setStudents(students);System.out.println(aClass);//选择排序序aClass.selectionSort();System.out.println("选择排序序后的结结果:\n");System.out.println(aClass);}}对对数组元元素进行行排序(续)——例7_2对象数组组29运行结果果班级:软软件0201容容量:40实实际人数数:5学号姓姓名英英语数数学计计算机总总成成绩250201李李红红887660224250202张张林林786780225250203董董玉玉梅868075241250204张张力力706875213250205何何为为809078248选择排序序后的结结果:班级:软软件0201容容量:40实实际人数数:5学号姓姓名英英语数数学计计算机总总成成绩250205何何为为809078248250203董玉梅梅868075241250202张林786780225250201李红887660224250204张力706875213对对数组元素素进行排序(续)——例7_2运行结果对象数组30插入排序将待排序的数数据按一定的的规则逐一插插入到已排序序序列中的合合适位置处,,直到将全部部数据都插入入为止插入的规则不不同,便形成成了不同的插插入排序方法法。其中,算算法最简单的的为直接插入入排序方法直接插入排序序方法先以未未排序序列的的第一个元素素作为已排序序子序列,然然后从原来的的第二个元素素起,将各元元素逐一插入入到已排序子子序列中合适适的位置,直直到把全部元元素都插入为为止。对对数组元素素进行排序(续)——插入排序序对象数组31直接插入排序序的步骤假设数组a中有n个元素a[0]、a[1]、………、a[n-1]首先要把a[0]作为已排序子子序列。然后后逐一将a[1]、a[2]、………、a[n-1]插入到已排序序子序列中。。每插入一个个元素a[i]都要执行如下下两步操作::第一步,在已已排序子序列列中找一个合合适位置j,使a[j]>a[i]>a[j+1]。第二步,将a[i]插入到a[j]之后。在插入入之前,需要要先保存a[i]的值,之后将将a[j+1]、……、a[n-1]依次向后移一一位(后移操操作也可在第第一步的查找找过程中进行行)对对数组元素素进行排序(续)——直接插入入排序对象数组32在StudentClass中增加直接插插入排序方法法insertSort,,代码如下publicvoidinsertSort(){Studenttemp;for(inti=1;i<size;i++){temp=students[i];intj=i-1;while(j>-1&&pare(students[j])>0){students[j+1]=students[j];j--;}students[j+1]=temp;}}对对数组元素素进行排序(续)——例7_3对象数组33在在已排序的的数组中查找找一批Integer类型的数据已已按升序排列列好,a1<a2<…<an,存储在数组组a[0]、a[1]、……、a[n-1]中,现在要对对该数组进行行查找,看给给定的数据x是否在此数组组中顺序查找方法法按从左向右的的顺序查找,,当x小于a[i]时就应该停止止查找publicintseqSearch(intx){for(inti=0;(i<n)&&(x>=a[i].intValue());i++)if(a[i].intValue()==x)returni;return-1;}二分查找。在在0到n-1中间选一个正正整数k,用k把原来的有序序序列分为三三个有序子序序列:a[0],a[1],…,a[k-1]a[k]a[k+1],a[k+2],…,a[n-1]对象数组34具有排序数组组的类SortedIntArraysearch方法运用二分分查找算法::在给定的数数组范围内查查找某一元素素,如果存在在,返回元素素所在的下标标位置,如果果不存在,则则返回元素应应该在的位置置(如果要将将此元素插入入到数组中,,且保持数组组仍然有序的的位置)将此功能与插插入功能相结结合,可实现现对数组元素素进行排序publicclassSortedIntArray{privateintcapacity;privateInteger[]rep;privateintsize;publicSortedIntArray(intn){capacity=n;rep=newInteger[capacity];}7.1.3在已排序的数数组中查找(续)——例7_4对象数组35publicSortedIntArray(){this(100);}privateintsearch(inti,intlower,intupper){intindex=lower;if(upper>=lower){intmiddle=(upper+lower)/2;intcurrent=rep[middle].intValue();if(current==i){index=middle;}elseif(current<i){index=search(i,middle+1,upper);}else{index=search(i,lower,middle-1);}}returnindex;}7.1.3在已排序的数数组中查找(续)——例7_4对象数组36publicintsearch(inti){returnsearch(i,0,size-1);}publicSortedIntArrayinsert(inti){Intindex=search(i);for(intj=size;j>index;--j){rep[j]=rep[j-1];}rep[index]=newInteger(i);++size;returnthis;}publicSortedIntArrayremove(inti){intindex=search(i);if(rep[index].intValue()==i){--size;for(intj=index;j<size;++j){rep[j]=rep[j+1];}}returnthis;}7.1.3在已排序的数数组中查找(续)——例7_4对象数组37publicStringtoString(){StringtoReturn="";for(inti=0;i<size;++i){toReturn+=rep[i].toString()+",";}returntoReturn;}staticpublicvoidmain(String[]args){SortedIntArrayanArray=newSortedIntArray();anArray.insert(4).insert(9).insert(7).insert(1).insert(3).insert(2).insert(8).insert(7);System.out.println(anArray);anArray.remove(1).remove(8).remove(7).remove(3);System.out.println(anArray);}}7.1.3在已排序的数数组中查找(续)——例7_4对象数组38运行结果1,2,3,4,7,7,8,9,2,4,7,9,7.1.3在已排序的数数组中查找(续)——例7_4运行结果对象数组397.3集合数组的优点是Java提供的随机访访问对象序列列的最有效方方法是一个简单的的线性序列,,访问元素的的速度较快数组的缺点大小自创建以以后就固定了了,在其整个个生存期内其其大小不可改改变数组元素只能能是同一类型型集合可动态改变其其大小可在序列中存存储不同类型型的数据40集合把具有相同性性质的一类东东西,汇聚成成一个整体在Java2中有很多与集集合有关的接接口及类它们被组织在在以Collection及Map接口为根的层层次结构中,,称为集合框架在Java2之前,在Java1.0/1.1中,没有完整的的集合框架。。只有一些简简单的可以自自扩展的容器器类VectorHashtable7.3集合(续)集合合41集合框架集合框架(JavaCollectionsFramework)为表示和操作作集合而规定定的一种统一一的标准的体体系结构提供了一些现现成的数据结结构可供使用用,程序员可可以利用集合合框架快速编编写代码,并并获得优良性性能包含三大块内内容对外的接口::表示集合的的抽象数据类类型,使集合合的操作与表表示分开接口的实现::指实现集合合接口的Java类,是可重用用的数据结构构对集合运算的的算法:是指指执行运算的的方法,例如如在集合上进进行查找和排排序集合合42集合框架接口口声明了对各种种集合类型执执行的一般操操作包括Collection、Set、List、SortedSet、Map、SortedMap基本结构如图图7.3.1Java集合框架(续)——对外的接接口集合合43类层次如图,,包括4个接口、4个抽象类及6个具体类7.3.1Java集合框架(续)——Collection接口CollectionAbstractCollectionVectorArrayListStackListSetSortedSetAbstractSetAbstractListAbstractSequentialListHashSetTreeSetLinkedList集合合44Collection接口声明了一组组操作成批批对象的抽抽象方法::查询方法法、修改方方法查询方法intsize()–返回集合对对象中包含含的元素个个数booleanisEmpty()–判断集合对对象中是否否还包含元元素,如果果没有任何何元素,则则返回truebooleancontains(Objectobj)––判断断对对象象是是否否在在集集合合中中booleancontainsAll(Collectionc)––判断断方方法法的的接接收收者者对对象象是是否否包包含含集集合合中中的的所所有有元元素素7.3.1Java集合合框框架架(续)———Collection接口口集合合45修改改方方法法包包括括booleanadd(Objectobj)––向集集合合中中增增加加对对象象booleanaddAll(Collectionc)––将参参数数集集合合中中的的所所有有元元素素增增加加到到接接收收者者集集合合中中booleanremove(Objectobj)––从集集合合中中删删除除对对象象booleanremoveAll(Collectionc)-将参参数数集集合合中中的的所所有有元元素素从从接接收收者者集集合合中中删删除除booleanretainAll(Collectionc)––在接接收收者者集集合合中中保保留留参参数数集集合合中中的的所所有有元元素素,,其其它它元元素素都都删删除除voidclear()––删除除集集合合中中的的所所有有元元素素7.3.1Java集合合框框架架(续)———Collection接口口集合合46Set接口口扩展展了了Collection禁止重复复的元素素,是数学学中“集集合”的的抽象对equals和hashCode操作有了了更强的的约定,,如果两两个Set对象包含含同样的的元素,,二者便便是相等等的实现它的的两个主主要类是是哈希集集合(HashSet)及树集合合(TreeSet)SortedSet接口一种特殊殊的Set其中的元元素是升升序排列列的,还还增加了了与次序序相关的的操作通常用于于存放词词汇表这这样的内内容7.3.1Java集合框架架(续)——Set、SortedSet接口集合合47List接口扩展了Collection可包含重重复元素素元素是有有顺序的的,每个个元素都都有一个个index值(从0开始)标标明元素素在列表表中的位位置实现它的的四个主主要类是是VectorArrayList:一种类类似数组组的形式式进行存存储,因因此它的的随机访访问速度度极快LinkedList:内部实实现是链链表,适适合于在在链表中中间需要要频繁进进行插入入和删除除操作栈Stack7.3.1Java集合框架架(续)——List接口集合合48Map接口不是Collection接口的继继承用于维护护键/值对(key/valuepairs)描述了从从不重复复的键到到值的映映射,是是一个从从关键字字到值的的映射对对象其中不能能有重复复的关键键字,每每个关键键字最多多能够映映射到一一个值SortedMap接口一种特殊殊的Map,其中的的关键字字是升序序排列的的与SortedSet对等的Map,通常用用于词典典和电话话目录等等7.3.1Java集合框架架(续)——Map、SortedMap接口集合合49接口的实实现Collection没有直接接的实现现,只是是作为其其他集合合接口的的最小公公分母除Collection以外,其其余五个个接口都都有实现现主要的实实现有SetHashSetSortedSetTreeSetListVector/ArrayList/LinkedListMapHashMapSortedMapTreeMap7.3.1Java集合框架架(续)——接口口的实现现集合合50对集合运运算的算算法大多数算法法都是用于于操作List对象有两个(min和max)可用于任意意集合对象象排序算法sort对List重新排序,,使其中的的元素按照照某种次序序关系升序序排列有两种形式式简单形式只只是将元素素按照自然然次序排列列第二种形式式需要一个个附加的Comparator对象作为参参数,用于于规定比较较规则,可可用于实现现反序或特特殊次序排排序7.3.1Java集合框架(续)——对集合合运算的算算法集合合51洗牌算法shuffle其作用与排排序算法恰恰好相反,,它打乱List中的任何次次序。也就就是说以随随机方式重重排元素,,任何次序序出现的几几率都是相相等的在实现偶然然性游戏的的时候,这这个算法很很有用,例例如洗牌常规数据处处理算法reverse::将一个List中的元素反反向排列fill:用指定的的值覆写List中的每一个个元素,这这个操作在在重新初始始化List时有用copy::接受两个个参数,目目标List和源List,将源中的的元素复制制到目标,,覆写其中中的内容。。目标List必须至少与与源一样长长,如果更更长,则多多余的部分分内容不受受影响7.3.1Java集合框架(续)——对集合运算算的算法集合合52查找算法binarySearch使用二分法法在一个有有序的List中查找指定定元素有两种形式式第一种形式式假定List是按照自然然顺序升序序排列的第二种形式式需要增加加一个Comparator对象,表示示比较规则则,并假定定List是按照这种种规则排序序的。寻找最值——用于任何集集合对象min和max算法返回指指定集合中中的最小值值和最大值值这两个算法法分别都有有两种形式式简单形式按按照元素的的自然顺序序返回最值值另一种形式式需要附加加一个Comparator对象作为参参数,并按按照Comparator对象指定的的比较规则则返回最值值7.3.1Java集合框架(续)——对集合运算算的算法集合合53Arrays类Java集合框架提提供了一套套专门用于于操作数组组的实用方方法,它们们作为静态态方法存在在该类中还包括可以以将数组视视为列表((List)的静态工工厂常用方法fill(type[]a,typeval):给数组填充充,就是简简单地把一一个数组全全部或者某某段数据填填成一个特特殊的值equals(type[]a,type[]b):实现两个个数组的比比较,相等等时返回truesort(type[]a):对数组排序序binarySearch(

):对数组元素素进行二分分法查找Arrays.asList(Object[]a):实现数组到到ArrayList的转换7.3.1Java集合框架(续)——数组实用方方法集合合54数组的填充充和复制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);}}JDK1.5,可使用Arrays.toString函数方便的的显示出数数组的内容容7.3.1Java集合框架(续)——数组实用方方法集合合55数组的比较较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));//truea2[3]=11;System.out.println(Arrays.equals(a1,a2));//falseString[]s1=newString[5];Arrays.fill(s1,"Hi");String[]s2={"Hi","Hi","Hi","Hi","Hi"};System.out.println(Arrays.equals(s1,s2));//true}}7.3.1Java集合框架(续)——数组实实用方法集合合56向量(Vector,ArrayList)Vector/ArrayList实现了Collection接口的具体体类能够存储任任意对象,,但通常情情况下,这这些不同类类型的对象象都具有相相同的父类类或接口不能存储基基本类型((primitive)的数据,,除非将这这些数据包包裹在包裹裹类中其容量能够够根据空间间需要自动动扩充增加元素方方法的效率率较高,除除非空间已已满,在这这种情况下下,在增加加之前需要要先扩充容容量Vector方法是同步步的,线程程安全ArrayList方法是非同同步的,效效率较高集合合57Vector类的构造方方法VectormyVector=newVector();//初始容量为为10VectormyVector=newVector(intcap);VectormyVector=newVector(Collectioncol);以参数col中的元素进进行初始化化也可用数组组元素生成成,但需先先将数组转转换成List对象,如String[]num={"one","two","three","four","five"};VectoraVector=newVector(java.util.Arrays.asList(num));ArrayList的构造方法法与Vector类似ArrayListmyList=newArrayList();ArrayListmyList=newArrayList(intcap);ArrayListmyList=newArrayList(Collectioncol);向量(Vector,ArrayList)(续)——构造方方法集合合58本节所有常常用方法如如无特殊说说明,为Vector,ArrayList类共有之方方法voidadd(Objectobj)——添加一个对对象,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");booleanaddAll(Collectioncol)——添加整个集集合,如果果接收者对对象的结果果有变化,,则返回true,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");VectoryourList=newVector();yourList.addAll(teamList);向量(Vector,ArrayList)(续)——常用方方法1集合合59intsize()——返回元素的的个数。booleanisEmpty()——如果不含元元素,则返返回trueObjectget(intpos)——返回指定位位置的元素素,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.get(1);//返回"LiHong"teamList.get(3);//产生例例外ArrayIndexOutOfBoundsException集合合向量(Vector,ArrayList)(续)——常常用方方法260voidset(intpos,Objectobj)——用参数数对象象替换换指定定位置置的对对象,,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.set(2,"LiuNa");System.out.println(teamList);//显示[ZhangWei,LiHong,LiuNa]teamList.set(3,"MaLi");//产生例例外ArrayIndexOutOfBoundsException集合合向量(Vector,ArrayList)(续)——常常用方方法361booleanremove(Objectobj)——去除给给定对对象的的第一一次出出现,,如果果找到到了对对象,,则返返回true。去除除一个个对象象后,,其后后面的的所有有对象象都依依次向向前移移动。。如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove("LiHong");teamList.remove("WangHong");//不做任任何事事,也也不出出现错错误System.out.println(teamList);//显示[ZhangWei,YuHongshu]集合合向量(Vector,ArrayList)(续)——常常用方方法462Objectremove(intpos)——去除给给定位位置的的元素素,并并返回回被去去除的的对象象。如如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove(0);//去除ZhangWeiteamList.remove(0);//去除LiHongSystem.out.println(teamList);//显示[YuHongshu]teamList.remove(1);//产生例例外ArrayIndexOutOfBoundsException集合合向量(Vector,ArrayList)(续)——常常用方方法563booleanremoveAll(Collectioncol)——从接收收者对对象中中去除除所有有在参参数对对象中中出现现的元元素,,如果果接收收者对对象的的结果果有变变化,,则返返回true。如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");VectoryourList=newVector();yourList.add("YuHongshu");yourList.add("HeLi");yourList.add("ZhangWei");teamList.removeAll(yourList);System.out.println(teamList);//显示[LiHong]集合合向量(Vector,ArrayList)(续)——常常用方方法664voidclear()——去除所所有的的元素素booleancontains(Objectobj)——返回是是否包包含指指定的的对象象,如如果包包含则则返回回true;否则则,返返回falsebooleancontainsAll(Collectioncol)——返回是是否包包含参参数col中的所所有对对象intindexOf(Objectobj)——返回给给定对对象在在Vector/ArrayList中第一一次出出现的的位置置,如如不存存在,,则返返回-1。如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.indexOf("LiHong");//返回1。teamList.indexOf("ZhangLi");//返回-1。集合合向量(Vector,ArrayList)(续)——常常用方方法765Enumerationelements()——返回包包含Vector中所所有有元元素素的的Enumeration类对对象象。。该方方法法只只能能应应用用于于Vector对象象,,不不能能应应用用于于ArrayList对象象。。如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.elements();//返回回Enumeration类对对象象。。Iteratoriterator()———返回回包包含含Vector/ArrayList中所所有有元元素素的的Iterator类对对象象集合合向量量(Vector,ArrayList)(续)———常常用用方方法法866当使使用用get()方法法取取出出Vector中的的元元素素时时,,返返回回的的类类型型都都是是Object类型型。。Vector的使使用用者者需需要要记记住住存存入入对对象象的的具具体体类类型型,,当当使使用用get()方法法取取出出后后,,再再塑塑型型成成其其本本来来的的类类型型。。例例如如,,创创建建Customer类对对象象的的Vector如下下::String[]names={"Zhang","Li","Wang","Zhao"};Vectorv=newVector();for(inti=0;i<names.length;i++){Customerc=newCustomer();c.setName(names[i]);v.add(c);}使用用get()方法法将将Customer对象象从从Vector中取取出出后后,,需需要要再再塑塑型型成成Customer类。。代代码码如如下下::for(inti=0;i<v.size();i++){Customerc=(Customer)v.get(i);System.out.println(c.getName());}向量量(Vector,ArrayList)(续)———使使用用Vector存取对象集合合67与所有的集集合类一样样,Vector不能存储原原始类型((primitive)的数据,,如果要存存储,则需需要使用包包裹类。例例如,VectorrateVector=newVector();double[]rates={36.25,25.4,18.34,35.7,23.78};for(inti=0;i<rates.length;i++)rateVector.add(newDouble(rates[i]));当从Vector中取出时,,需要塑型型成相应的的包裹类型型,之后再再还原为原原始类型。。代码如下下:doublesum=0.0;for(inti=0;i<rateVector.size();i++)sum+=((Double)rateVector.get(i)).doubleValue();returnsum;向量(Vector,ArrayList)(续)——使用Vector存取数据集合合68Enumeration及Iterator接口集合类对象象中每个元元素的遍历历方法for(inti=0;i<v.size();i++){Customerc=(Customer)v.get(i);System.out.println(c.getName());}Enumeration/Iterator能够从集合合类对象中中提取每一一个元素,,并提供了了用于遍历历元素的方方法Java中的许多方方法(如elements())都返回Enumeration类型的对象象,而不是是返回集合合类对象Enumeration接口不能用用于ArrayList对象,而Iterator接口既可以以用于ArrayList对象,也可可以用于Vector对象集合合69Enumeration接口(1.0版)提供了两个个实例方法法hasMoreElements()——判断是否还还有剩下的的元素;nextElement()——取得下一个个元素。遍历集合类类对象v中的每个元元素可使用用下面代码码完成:Enumeratione=v.elements();while(e.hasMoreElements()){Customerc=(Customer)v.nextElement();System.out.println(c.getName());}Enumeration及Iterator接口(续)——Enumeration接口集合合70Enumeration类使用举例例importjava.util.Vector;importjava.util.Enumeration;publicclassEnumerationTester{publicstaticvoidmain(Stringargs[]){Enumerationdays;VectordayNames=newVector();dayNames.add("Sunday");dayNames.add("Monday");dayNames.add("Tuesday");dayNames.add("Wednesday");dayNames.add("Thursday");dayNames.add("Friday");dayNames.add("Saturday");days=dayNames.elements();while(days.hasMoreElements())System.out.println(days.nextElement());}}7.3.3Enumeration及Iterator接口(续)——例7_6集合合71运行结果SundayMondayTuesdayWednesdayThursdayFridaySaturday常见编程错错误在一次循环环中调用两两次nextElement()方法在遍历的过过程中从集集合对象中中去除元素素,具体见见例7-77.3.3Enumeration及Iterator接口(续)——例7_6运行结果集合合72Enumeration类的问题举举例importjava.util.Vector;importjava.util.Enumeration;publicclassEnumerationTester2{publicstaticvoidmain(Stringargs[]){String[]num={"one","two","three","four","five","six","seven","eight","nine","ten"};VectoraVector=newVector(java.util.Arrays.asList(num));System.out.println("BeforeVector:"+aVector);Enumerationnums=aVector.elements();while(nums.hasMoreElements()){StringaString=(String)nums.nextElement();System.out.println(aString);if(aString.length()>4)aVector.remove(aString);}System.out.println("AfterVector:"+aVector);}}7.3.3Enumeration及Iterator接口(续)——例7_7集合合73运行结果BeforeVector:[one,two,three,four,five,six,seven,eight,nine,ten]onetwothreefivesixsevenninetenAfterVector:[one,two,four,five,six,eight,nine,ten]可见,长度度大于4的字符串并并没有如预预期的那样样都从向量量中去除。。这是Enumeration类存在的问问题。因此此,如果需需要在遍历历的过程中中去除对象象,就不要要使用Enumeration类7.3.3Enumeration及Iterator接口(续)——例7_7运行结果集合合74Iterator接口(1.2版,替代Enumeration)也是一个遍遍历集合元元素的工具具,是对Enumeration接口的改进进,因此在在遍历集合合元素时

温馨提示

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

评论

0/150

提交评论