孟凡超哈尔滨工业大学(威海)计算机科学与技术学院mfc@hitwh.edu.cn2辛运帏,饶一梅,马素霞.Java程序设计(第二版).清华大学出版社,2006.3第1章概述第2章标识符和数据类型第3章表达式和流程控制语句第4章数组、向量和字符串第5章进一步讨论对象和类第6章Java语言中的异常第7章Java的图形用户界面设计第8章Swing组件第9章JavaApplet第10章Java数据流第11章线程第12章Java网络功能44.1数组4.2Vector类4.3字符串类型5数组说明数组是一个数据结构,用来存储相同类型的数据。一个数组是系列的匿名变量,数组中的元素可以通过下标来访问。Java将数组作为对象来处理。类Object中定义的方法都可以用于数组对象。数组元素可以是基本类型,也可以是类类型,还可以是数组。6一维数组的定义typearrayName[];其中,类型(type)可以为Java中任意的数据类型,包括简单类型和复合类型,数组名称arrayName为一个合法的标识符,[]指明该变量是一个数组类型变量。chars[];//s的每个元素都是char类型的intintArray[];//intArray中的每个元素都是整型的DatedateArray[];//dateArray的每个元素都是复合数据类型DatePointpoints[];//points的每个元素都是类Point类型•在数组定义中不为数组元素分配内存,因此方括号[]中不用指出数组中元素的个数,即数组的长度。•说明并不创建数组,它们只是引用变量,用来指向一个数组。7一维数组的定义(另一种方式)Type[]arrayName;char[]s;//s的每个元素都是char类型的int[]intArray;//intArray中的每个元素都是整型的Date[]dateArray;//dateArray的每个元素都是复合数据类//型DatePoint[]points;//points的每个元素都是类Point类型8创建数组定义一个数组只是对数组的说明,系统并没有为数组分配任何内容,因此我们还不能访问它的任何元素。数组必须经过初始化后才能应用数组的元素,这个过程就是数组的创建的过程。数组的初始化分为:静态初始化和动态初始化。静态初始化:定义数组的同时对数组元素进行初始化。9Stringnames[]={“Zhang”,“Li”,“Wang”}Stringnames[];names=newString[3];names[0]=“Zhang”;names[1]=“Li”;names[2]=“Wang”;10Stringnames[]=newString[3];//给数组names分配//3个应用空间String[]names=newString[3];//定义String类型数组动态初始化:使用运算符new为数组分配空间。数组说明的方括号中的数字表示数组元素个数。type[]arrayName=newtype[arraySize];typearrayName[]=newtype[arraySize];names[0]=“Zhang”;names[1]=“Li”;names[2]=“Wang”;11复合类型数组使用运算符new为只是为数组本身分配空间,并没有对数组的元素进行初始化。对于复合类型的数组,需要经过两步进行空间分配:创建数组本身:typearrayName[]=newtype[arraySize];创建各个数组元素:arrayName[0]=newtype(paramList);arrayName[1]=newtype(paramList);……arrayName[arraySize-1]=newtype(paramList);12//创建有3个Point型的数组Pointpoint[]=newPoint[3];//创建3个Point型的数组元素point[0]=newPoint();point[1]=newPoint();point[2]=newPoint();13Point[]point;pointpoint=newPoint[10];...........point.length:10..........point.length:10point[0]=newPoint();point[1]=newPoint();x:y:x:y:14Java中没有静态数组定义,数组的内存都是通过new动态分配的。该写法是错误的:intintArray[5];Object[]point;point=newPoint[3];Point[]point;point=newObject[3];15数组边界数组下标从0开始,数组中的元素个数length是数组类中的唯一数据成员变量。使用new创建数组时系统自动给length赋值。数组一旦创建完毕,其大小就固定下来。int[]list=newint[10];for(inti=0;ilist.length;i++){//循环体代码}16数组元素的引用当定义了一个数组,并用运算符new为它分配了内存空间后,就可以引用数组中的每一个元素了。数组名加上下标就可以表示数组元素,元素的应用格式为:arrayName[index];例如,arrayName[0],arrayName[i]当创建一个数组时,每个元素都被初始化。例如,字符型数组的每个值被初始化为0(\0000),而Point型数组的每个值被初始化围null。17多维数组多维数组的定义Java中没有真正的多维数组,但因为数组元素可以说明为任何类型,所以可以建立数组的数组(的数组……),由此得到多维数组。一般来讲,n维数组是n-1维数组的数组。说明数组时使用类型及多对方括号。例如,int[][]是类型,它表示二维数组。typearrayName[][];type[][]arrayName;二维数组的定义:18intintarray[][];Int[][]intarray;与一维数组一样,定义时对数组元素没有分配内存空间,需要使用new运算符来分配内存,然后才可以访问每个元素。三维数组定义:typearrayName[][][];type[][][]arrayName;19多维数组的初始化静态初始化:int[][]intArray={{2,3},{1,5},{3,4}};intArray为一个3行2列的数组231534最外层括号所包含的元素是数组的第一维的各元素;最内层括号对应于数组最后一维。20123456789101112使用两个下标可以访问数组中的任一元素,例如,intArray1[0][0]//表示第1行第1列元素1intArray1[1][3]//表示第2行第4列元素721动态初始化:int[][]intArray=newtype[arraylength1][arraylength2];typearrayN[][]=newtype[arraylength1][];arrayN[0]=newtype[arraylength2];arrayN[1]=newtype[arraylength2];…arrayN[arraylenth1-1]=newtype[arraylength2];•方法1:直接为每一维分配空间•方法2:多维数组可以从高维起,分别为每一维分配内存。2212345678910111223多维数组的引用在定义并初始化多维数组后,可以使用多维数组中的每个元素。多维数组的引用方式为(以二维为例):arrayName[index1][index2]intintArray[][]=newint[3][4];intArray[0][0]=1;intArray[0][1]=2;intArray[0][2]=3;24数组复制将elements中第1个(下标为0)到第elements.length个元素依次放到hold中下标从0开始的各个位置,即第1位到第5位。执行完毕,数组hold的内容为:1,2,3,4,5,11,1225Java中的数组只能保存固定数目的元素,且必须把所有需要的内存单元一次性的申请出来,而不能先创建数组再追加数组元素数量,为了解决这个问题Java中引入了向量类Vector。Vector也是一组对象的集合,但相对于数组,Vector可以追加对象元素数量,可以方便的修改和维护序列中的对象。261向量(Vector)Vector是java.util类包提供一个工具类。Vector对应于类似数组的顺序存储的数据结构,但是具有比数组更强大的功能。它允许不同类型元素共存的变长数组。每个Vector类的对象可以表达一个完整的数据序列。Vector类的对象不但可以保存顺序的一列数据,而且还可以提供了许多有用的方法来操作和处理这些数据。Vector类的对象所表达的序列中元素的个数是可变的,即Vector实现了变长数组。27向量比较适合在如下情况使用:需要处理的对象数组不定,序列中的元素都是对象或可以表示为对象。需要将不同类的对象组合成一个数据序列。需要做频繁的对象序列中元素的插入和删除。经常需要定位序列中的对象和其他查找操作。在不同的类之间传递大量的数据。Vector类的局限性是其中的对象不能是简单数据类型。28Vector类的构造方法publicVector():构造一个空向量。publicVector(intinitialCapacity):以指定的初始存储容量initialCapacity构造一个空向量vector。publicVector(intinitialCapacity,intcapacityIncrement):以指定的初始存储容量initialCapacity和容量增量capacityIncrement构造一个空向量vector。29VectorMyVector=newVector(100,50);该语句创建的MyVector向量序列初始有100个元素空间,以后一旦空间用尽则以50为单位递增,使序列中元素的个数变化成150,200,…。在创建Vector序列时,不需要指明序列中元素的类型,可以在使用时确定。30Vector类对象的操作元素的添加addElement(Objectobj):将新元素添加到序列尾部。insertElementAt(Objectobj,intindex):将指定对象obj插入指定位置index位置。VectorMyVector=newVector();for(inti=1;i=10;i++){MyVector.addElement(newRandom());}MyVector.insertElementAt(middle,5);31元素的删除setElementAt(Objectobj,intindex):将向量序列index位置处的对象元素设置为obj,如果这个位置原来有元素,则将被新值覆盖。removeElement(Objectobj):删除向量序列中第一个与指定的obj对象相同的元素,同时将后面的元素向前提,补上空位。removeElement(intindex):删除index指定位置处的元素,同时将后面的元素向前提。removeAllElements():清除向量序列中的所有元素,同时向量的大小置为0。32元素的查找ObjectelementAt(intindex):返回指定位置处的元素。这个方法返回值是Object类型的对象,在使用之前通常需要进行强制类型转换,将返回的对象引用转换成Object类的某个具体子类对象。booleancontains(Objectobj):检查向量序列中是否包含指定的对象元素obj。intindexOf(Objectobj,intstart_index):从指定的start_index位置开始向后搜索,返回所找到的第一个