版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于对象群体的组织2目录7.1对象数组7.3集合(Collection,Map)7.4本章小结第2页,共108页,2024年2月25日,星期天37.1对象数组数组在Java提供的存储及随机访问对象序列的各种方法中,数组是效率最高的一种类型检查边界检查优点数组知道其元素的类型编译时的类型检查大小已知代价数组对象的大小是固定的,在生存期内大小不可变第3页,共108页,2024年2月25日,星期天4对象数组数组元素是类的对象所有元素具有相同的类型每个元素都是一个对象的引用对象数组7.1对象数组(续)第4页,共108页,2024年2月25日,星期天5静态初始化:在声明和定义数组的同时对数组元素进行初始化,例如: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页,共108页,2024年2月25日,星期天6使用数组存储一个班的学生信息及考试成绩。学生信息包括学号、姓名、三门课(英语、数学、计算机)的成绩及总成绩。首先声明学生类Student属性包括学号(id),姓名(name),英语成绩(eng),数学成绩(math),计算机成绩(comp),总成绩(sum)方法包括构造方法,get方法,set方法,toString方法,equals方法,compare方法(比较两个学生的总成绩,结果分大于,小于,等于),sum方法(计算总成绩)实现Serializable接口,以便对象持久化,7.1.1用数组存储对象(续)
——例7_1对象数组第6页,共108页,2024年2月25日,星期天7importjava.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页,共108页,2024年2月25日,星期天8 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页,共108页,2024年2月25日,星期天9 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页,共108页,2024年2月25日,星期天10 publicStringgetName(){ returnname; } publicintgetEng(){ returneng; } publicintgetMath(){ returnmath; } publicintgetComp(){ returncomp; } publicintgetSum(){ returnsum; }
voidsum(){ this.sum=eng+math+comp; }
7.1.1用数组存储对象(续)
——例7_1对象数组第10页,共108页,2024年2月25日,星期天11 publicStringtoString(){ 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.1用数组存储对象(续)
——例7_1对象数组第11页,共108页,2024年2月25日,星期天12下面声明班级类StudentClass:属性包括班级名称(name),容量(capacity),学生(students),实际人数(size)。方法包括构造方法,get方法,set方法,toString方法。publicclassStudentClass{ privateStringname;//班级名称
staticintcapacity=40;//最大容量
privateStudentstudents[];//学生
privateintsize;//实际人数
7.1.1用数组存储对象(续)
——例7_1对象数组第12页,共108页,2024年2月25日,星期天13
publicStudentClass(Stringname,intsize){ =name; this.size=size; students=newStudent[capacity]; } publicStringgetName(){ returnname; }publicintgetCapacity(){ returncapacity; } publicStudent[]getStudents(){ returnstudents; } 7.1.1用数组存储对象(续)
——例7_1对象数组第13页,共108页,2024年2月25日,星期天14 publicintgetSize(){ 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.1用数组存储对象(续)
——例7_1对象数组第14页,共108页,2024年2月25日,星期天15 publicStringtoString(){ 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.1用数组存储对象(续)
——例7_1对象数组第15页,共108页,2024年2月25日,星期天16下面声明测试类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.1用数组存储对象(续)
——例7_1对象数组第16页,共108页,2024年2月25日,星期天17 //将学生信息保存到文件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.1用数组存储对象(续)
——例7_1对象数组第17页,共108页,2024年2月25日,星期天18 publicstaticStudentgetAStudent(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.1用数组存储对象(续)
——例7_1对象数组第18页,共108页,2024年2月25日,星期天19运行结果如下(其中学生信息的输入只显示一部分):输入第1个学生的信息:学号:250201姓名:李红英语成绩:88数学成绩:76计算机成绩:60输入第2个学生的信息:……班级:软件0201容量:40实际人数:5学号姓名英语数学计算机总成绩250201李红887660224250202张林786780225250203董玉梅868075241250204张力706875213250205何为8090782487.1.1用数组存储对象(续)
——例7_1运行结果对象数组第19页,共108页,2024年2月25日,星期天20查找也称为检索,就是从一组数据中找出所需的具有某种特征的数据项顺序查找对所存储的数据从第一项开始(也可以从最后一项开始),依次与所要查找的数据进行比较,直到找到该数据或将全部元素都找完还没有找到该数据为止7.1.1用数组存储对象(续)
——为班级类添加查找方法对象数组第20页,共108页,2024年2月25日,星期天21已知学生的学号,查找此学生是否存在。如果存在,返回其在数组中的下标位置;如果不存在,返回-1。顺序查找方法的代码如下publicintfind(Stringid){ for(inti=0;i<size;i++) if(students[i].getId().equals(id))returni; return-1;}7.1.1用数组存储对象(续)
——为班级类添加查找方法对象数组第21页,共108页,2024年2月25日,星期天22在数组的末尾增加一个学生对象增加之前需先判断数组中是否还有空间,并且在数组中查找将要增加的学号是否已经存在增加成功,返回true;否则,返回false
publicbooleanadd(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; }7.1.1用数组存储对象(续)
——为班级类添加增加方法对象数组第22页,共108页,2024年2月25日,星期天23已知一个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; } 7.1.1用数组存储对象(续)
——为班级类编写删除方法对象数组第23页,共108页,2024年2月25日,星期天24已知学号,删除一个学生
publicbooleandel(Stringid){ intpos=find(id); if(pos==-1)returnfalse; for(inti=pos+1;i<size;i++) students[i-1]=students[i]; size--; returntrue; } 7.1.1用数组存储对象(续)
——为班级类添加删除方法对象数组第24页,共108页,2024年2月25日,星期天257.1.2对数组元素进行排序排序按照预先规定的准则(如升序或降序等),把数据有次序地排列起来已经设计出许多排序算法,常用的排序算法有选择排序插入排序交换排序以降序为例进行介绍对象数组第25页,共108页,2024年2月25日,星期天26选择排序的基本思想先在未排序序列中选一个最小元素,作为已排序子序列然后再重复地从未排序子序列中选取一个最小元素,把它加到已经排序的序列中,作为已排序子序列的最后一个元素直到把未排序子序列中的元素处理完为止7.1.2对数组元素进行排序(续)
——选择排序对象数组第26页,共108页,2024年2月25日,星期天27用选择排序方法将例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.1.2对数组元素进行排序(续)
——例7_2对象数组第27页,共108页,2024年2月25日,星期天28测试类代码如下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.1.2对数组元素进行排序(续)
——例7_2对象数组第28页,共108页,2024年2月25日,星期天29 StudentClassaClass=newStudentClass("软件0201",5);
aClass.setStudents(students); System.out.println(aClass); //选择排序
aClass.selectionSort(); System.out.println("选择排序后的结果:\n"); System.out.println(aClass); }}7.1.2对数组元素进行排序(续)
——例7_2对象数组第29页,共108页,2024年2月25日,星期天30运行结果班级:软件0201容量:40实际人数:5学号姓名英语数学计算机总成绩250201李红887660224250202张林786780225250203董玉梅868075241250204张力706875213250205何为809078248选择排序后的结果:班级:软件0201容量:40实际人数:5学号姓名英语数学计算机总成绩250205何为809078248250203董玉梅868075241250202张林786780225250201李红887660224250204张力7068752137.1.2对数组元素进行排序(续)
——例7_2运行结果对象数组第30页,共108页,2024年2月25日,星期天31插入排序将待排序的数据按一定的规则逐一插入到已排序序列中的合适位置处,直到将全部数据都插入为止插入的规则不同,便形成了不同的插入排序方法。其中,算法最简单的为直接插入排序方法直接插入排序方法先以未排序序列的第一个元素作为已排序子序列,然后从原来的第二个元素起,将各元素逐一插入到已排序子序列中合适的位置,直到把全部元素都插入为止。7.1.2对数组元素进行排序(续)
——插入排序对象数组第31页,共108页,2024年2月25日,星期天32直接插入排序的步骤假设数组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]依次向后移一位(后移操作也可在第一步的查找过程中进行)7.1.2对数组元素进行排序(续)
——直接插入排序对象数组第32页,共108页,2024年2月25日,星期天33在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.1.2对数组元素进行排序(续)
——例7_3对象数组第33页,共108页,2024年2月25日,星期天347.1.3在已排序的数组中查找一批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页,共108页,2024年2月25日,星期天35具有排序数组的类SortedIntArraysearch方法运用二分查找算法:在给定的数组范围内查找某一元素,如果存在,返回元素所在的下标位置,如果不存在,则返回元素应该在的位置(如果要将此元素插入到数组中,且保持数组仍然有序的位置)将此功能与插入功能相结合,可实现对数组元素进行排序publicclassSortedIntArray{ privateintcapacity; privateInteger[]rep; privateintsize;
publicSortedIntArray(intn){ capacity=n; rep=newInteger[capacity]; }
7.1.3在已排序的数组中查找(续)
——例7_4对象数组第35页,共108页,2024年2月25日,星期天36publicSortedIntArray(){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对象数组第36页,共108页,2024年2月25日,星期天37publicintsearch(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对象数组第37页,共108页,2024年2月25日,星期天38 publicStringtoString(){ 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页,共108页,2024年2月25日,星期天39运行结果1,2,3,4,7,7,8,9,2,4,7,9,7.1.3在已排序的数组中查找(续)
——例7_4运行结果对象数组第39页,共108页,2024年2月25日,星期天407.3集合数组的优点是Java提供的随机访问对象序列的最有效方法是一个简单的线性序列,访问元素的速度较快数组的缺点大小自创建以后就固定了,在其整个生存期内其大小不可改变数组元素只能是同一类型集合可动态改变其大小可在序列中存储不同类型的数据第40页,共108页,2024年2月25日,星期天41集合把具有相同性质的一类东西,汇聚成一个整体在Java2中有很多与集合有关的接口及类它们被组织在以Collection及Map接口为根的层次结构中,称为集合框架在Java2之前,在Java1.0/1.1中,没有完整的集合框架。只有一些简单的可以自扩展的容器类VectorHashtable7.3集合(续)集合第41页,共108页,2024年2月25日,星期天427.3.1Java集合框架集合框架(JavaCollectionsFramework)为表示和操作集合而规定的一种统一的标准的体系结构提供了一些现成的数据结构可供使用,程序员可以利用集合框架快速编写代码,并获得优良性能包含三大块内容对外的接口:表示集合的抽象数据类型,使集合的操作与表示分开接口的实现:指实现集合接口的Java类,是可重用的数据结构对集合运算的算法:是指执行运算的方法,例如在集合上进行查找和排序集合第42页,共108页,2024年2月25日,星期天43集合框架接口声明了对各种集合类型执行的一般操作包括Collection、Set、List、SortedSet、Map、SortedMap基本结构如图7.3.1Java集合框架(续)
——对外的接口集合第43页,共108页,2024年2月25日,星期天44类层次如图,包括4个接口、4个抽象类及6个具体类7.3.1Java集合框架(续)
——Collection接口CollectionAbstractCollectionVectorArrayListStackListSetSortedSetAbstractSetAbstractListAbstractSequentialListHashSetTreeSetLinkedList集合第44页,共108页,2024年2月25日,星期天45Collection接口声明了一组操作成批对象的抽象方法:查询方法、修改方法查询方法intsize()–返回集合对象中包含的元素个数booleanisEmpty()–判断集合对象中是否还包含元素,如果没有任何元素,则返回truebooleancontains(Objectobj)–判断对象是否在集合中booleancontainsAll(Collectionc)–判断方法的接收者对象是否包含集合中的所有元素7.3.1Java集合框架(续)
——Collection接口集合第45页,共108页,2024年2月25日,星期天46修改方法包括booleanadd(Objectobj)–向集合中增加对象booleanaddAll(Collectionc)–将参数集合中的所有元素增加到接收者集合中booleanremove(Objectobj)–从集合中删除对象booleanremoveAll(Collectionc)-将参数集合中的所有元素从接收者集合中删除booleanretainAll(Collectionc)–在接收者集合中保留参数集合中的所有元素,其它元素都删除voidclear()–删除集合中的所有元素7.3.1Java集合框架(续)
——Collection接口集合第46页,共108页,2024年2月25日,星期天47Set接口扩展了Collection禁止重复的元素,是数学中“集合”的抽象对equals和hashCode操作有了更强的约定,如果两个Set对象包含同样的元素,二者便是相等的实现它的两个主要类是哈希集合(HashSet)及树集合(TreeSet)SortedSet接口一种特殊的Set其中的元素是升序排列的,还增加了与次序相关的操作通常用于存放词汇表这样的内容7.3.1Java集合框架(续)
——Set、SortedSet接口集合第47页,共108页,2024年2月25日,星期天48List接口扩展了Collection可包含重复元素元素是有顺序的,每个元素都有一个index值(从0开始)标明元素在列表中的位置实现它的四个主要类是VectorArrayList:一种类似数组的形式进行存储,因此它的随机访问速度极快LinkedList:内部实现是链表,适合于在链表中间需要频繁进行插入和删除操作栈Stack7.3.1Java集合框架(续)
——List接口集合第48页,共108页,2024年2月25日,星期天49Map接口不是Collection接口的继承用于维护键/值对(key/valuepairs)描述了从不重复的键到值的映射,是一个从关键字到值的映射对象其中不能有重复的关键字,每个关键字最多能够映射到一个值SortedMap接口一种特殊的Map,其中的关键字是升序排列的与SortedSet对等的Map,通常用于词典和电话目录等
7.3.1Java集合框架(续)
——Map、SortedMap接口集合第49页,共108页,2024年2月25日,星期天50接口的实现Collection没有直接的实现,只是作为其他集合接口的最小公分母除Collection以外,其余五个接口都有实现主要的实现有Set
HashSetSortedSet
TreeSetListVector/ArrayList/LinkedListMap
HashMapSortedMap
TreeMap7.3.1Java集合框架(续)
——接口的实现集合第50页,共108页,2024年2月25日,星期天51对集合运算的算法大多数算法都是用于操作List对象有两个(min和max)可用于任意集合对象排序算法sort对List重新排序,使其中的元素按照某种次序关系升序排列有两种形式简单形式只是将元素按照自然次序排列第二种形式需要一个附加的Comparator对象作为参数,用于规定比较规则,可用于实现反序或特殊次序排序7.3.1Java集合框架(续)
——对集合运算的算法集合第51页,共108页,2024年2月25日,星期天52洗牌算法shuffle其作用与排序算法恰好相反,它打乱List中的任何次序。也就是说以随机方式重排元素,任何次序出现的几率都是相等的在实现偶然性游戏的时候,这个算法很有用,例如洗牌常规数据处理算法reverse::将一个List中的元素反向排列fill:用指定的值覆写List中的每一个元素,这个操作在重新初始化List时有用copy::接受两个参数,目标List和源List,将源中的元素复制到目标,覆写其中的内容。目标List必须至少与源一样长,如果更长,则多余的部分内容不受影响7.3.1Java集合框架(续)
——对集合运算的算法集合第52页,共108页,2024年2月25日,星期天53查找算法binarySearch使用二分法在一个有序的List中查找指定元素有两种形式第一种形式假定List是按照自然顺序升序排列的第二种形式需要增加一个Comparator对象,表示比较规则,并假定List是按照这种规则排序的。寻找最值——用于任何集合对象min和max算法返回指定集合中的最小值和最大值这两个算法分别都有两种形式简单形式按照元素的自然顺序返回最值另一种形式需要附加一个Comparator对象作为参数,并按照Comparator对象指定的比较规则返回最值7.3.1Java集合框架(续)
——对集合运算的算法集合第53页,共108页,2024年2月25日,星期天54Arrays类Java集合框架提供了一套专门用于操作数组的实用方法,它们作为静态方法存在该类中还包括可以将数组视为列表(List)的静态工厂常用方法fill(type[]a,typeval):给数组填充,就是简单地把一个数组全部或者某段数据填成一个特殊的值equals(type[]a,type[]b):实现两个数组的比较,相等时返回truesort(type[]a):对数组排序binarySearch(
):对数组元素进行二分法查找Arrays.asList(Object[]a):实现数组到ArrayList的转换7.3.1Java集合框架(续)
——数组实用方法集合第54页,共108页,2024年2月25日,星期天55数组的填充和复制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页,共108页,2024年2月25日,星期天56数组的比较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 }}7.3.1Java集合框架(续)
——数组实用方法集合第56页,共108页,2024年2月25日,星期天577.3.2向量(Vector,ArrayList)Vector/ArrayList实现了Collection接口的具体类能够存储任意对象,但通常情况下,这些不同类型的对象都具有相同的父类或接口不能存储基本类型(primitive)的数据,除非将这些数据包裹在包裹类中其容量能够根据空间需要自动扩充增加元素方法的效率较高,除非空间已满,在这种情况下,在增加之前需要先扩充容量Vector方法是同步的,线程安全ArrayList方法是非同步的,效率较高集合第57页,共108页,2024年2月25日,星期天58Vector类的构造方法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);7.3.2向量(Vector,ArrayList)(续)
——构造方法集合第58页,共108页,2024年2月25日,星期天59本节所有常用方法如无特殊说明,为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);
7.3.2向量(Vector,ArrayList)(续)
——常用方法1集合第59页,共108页,2024年2月25日,星期天60intsize()——返回元素的个数。booleanisEmpty()——如果不含元素,则返回trueObjectget(intpos)——返回指定位置的元素,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.get(1);//返回"LiHong"teamList.get(3);//产生例外ArrayIndexOutOfBoundsException集合7.3.2向量(Vector,ArrayList)(续)
——常用方法2第60页,共108页,2024年2月25日,星期天61voidset(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集合7.3.2向量(Vector,ArrayList)(续)
——常用方法3第61页,共108页,2024年2月25日,星期天62booleanremove(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]集合7.3.2向量(Vector,ArrayList)(续)
——常用方法4第62页,共108页,2024年2月25日,星期天63Objectremove(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集合7.3.2向量(Vector,ArrayList)(续)
——常用方法5第63页,共108页,2024年2月25日,星期天64booleanremoveAll(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]集合7.3.2向量(Vector,ArrayList)(续)
——常用方法6第64页,共108页,2024年2月25日,星期天65voidclear()——去除所有的元素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。集合7.3.2向量(Vector,ArrayList)(续)
——常用方法7第65页,共108页,2024年2月25日,星期天66Enumerationelements()——返回包含Vector中所有元素的Enumeration类对象。该方法只能应用于Vector对象,不能应用于ArrayList对象。如VectorteamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");teamList.elements();//返回Enumeration类对象。Iteratoriterator()——返回包含Vector/ArrayList中所有元素的Iterator类对象集合7.3.2向量(Vector,ArrayList)(续)
——常用方法8第66页,共108页,2024年2月25日,星期天67当使用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());}7.3.2向量(Vector,ArrayList)(续)
——使用Vector存取对象集合第67页,共108页,2024年2月25日,星期天68与所有的集合类一样,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;7.3.2向量(Vector,ArrayList)(续)
——使用Vector存取数据集合第68页,共108页,2024年2月25日,星期天697.3.3Enumeration及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对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年北京安全员B证考试题库(附答案)
- 2026职场半年工作总结报告 完整版可直接套用
- 职业教育现代产业学院建设申报书
- 公关危机处理创新创业项目商业计划书
- 创意设计创新创业项目商业计划书
- 2025-2030年心理咨询在线服务行业深度调研及发展战略咨询报告
- 2026年简化版旅游意外保险合同协议
- 石油钻井工程监督手册
- 环保大赛题目及答案英语
- 2026年理想汽车校招技术试题
- 开封滨润新材料有限公司 20 万吨年聚合氯化铝项目环境影响报告
- 驾考三力测试模拟题含答案
- 技术创新成熟度评价标准及评价细则
- 氩弧焊焊接工艺指导书
- 中国文学理论批评史名词解释
- 小学美术-点线面 黑白灰教学课件设计
- 电力建设施工质量验收及评价规程强制性条文部分
- 力士乐-mtx micro简明安装调试手册v4updated
- 第六章光化学制氢转换技术
- GB/T 9740-2008化学试剂蒸发残渣测定通用方法
- GB/T 6807-2001钢铁工件涂装前磷化处理技术条件
评论
0/150
提交评论