第四章数组和字符串1本章目录数组1字符串2字符串的运算3可变字符串42教学目标熟练掌握Java中数组的使用方法及能够熟练应用。掌握String类、StringBuffer类及StringTokenizer类中常用方法。3教学重点掌握数组的声明,生成和初始化方法。熟练掌握数组的使用,对于多维数据,要求学生主要掌握二维数组的声明、生成、初始化、及使用方法。掌握字符串的表示方式,字符串的各种常用运算明确可变字符串的实现方式及用途,能熟练掌握字符串的使用。44.1数组问题的提出现有一班级共30人,想要计算全班参加英语考试的平均分数,应如何设计程序实现?问题的分析(1)程序结构?顺序,选择,循环(2)数据结构?单变量,数组54.1数组数组:是一个具有相同类型变量的指定的集合的对象。数组元素:数组中的每个变量,由数组名和一个int型的整数值表示。索引:数据名后的整数值,一般放在数组名后面的方括号中。注意:数组中第一个元素的索引值是0。intage[];age[0]=18;数组名索引数组类型64.1.1数组变量数组变量和所引用的数组是两个分离的实体。为数组变量所分配的内存空间保存着对数组对象的引用,而不是数组对象本身。数组对象本身是一个存在于内存其它位置的独特实体。引用对象的变量中存储的是引用。引用记录着它所引用的对象的内存地址。74.1.1数组变量•基本数据类型一维数组内存分配栈内存堆内存numc0000088:44000088:4400newint[3]产生的对象数组的内存分配图84.1.1数组变量•基本数据类型一维数组内存分配栈内存堆内存numc000null0088:4400newint[3]产生的对象数组的内存分配图num=null;0088:440094.1.1数组变量堆内存studentsnullStudent[]students;栈内存104.1.1数组变量堆内存studentsc0088:44000088:4400newstudents[3]产生的对象nullnullStudent[]students;students=newStudent[3];null栈内存114.1.1数组变量堆内存studentsc0088:44000088:4400newstudents[3]产生的对象nullnullStudent[]students;students=newStudent[3];students[0]=newStudent(“lisi”,18);student[0]标识的Student对象lisi180088:46600088:4660栈内存124.1.2数组定义声明一维数组的两种格式:数组元素类型数组名字[];doubleanArray[];数组元素类型[]数组名字;double[]anArray;声明二维数组的两种格式:数组元素类型数组名字[][];数组元素类型[][]数组名字;创建数组数组名字=new数组元素的类型[数组元素的个数]注意:声明时不能指定数组的大小!134.1.2数组定义举例:intprimes[];primes=newint[10];或int[]primes=newint[10];注意数组的静态性:一旦创建就不能修改数组的长度!144.1.3数组长度利用数组对象的数据成员length可引用该数组的长度,即该数组中所包含的元素个数。若有:double[]myArray=newdouble[100];则可使用myArray.length来引用它的长度,即得到的数值为100。154.1.3数组长度double[]anArray;anArray=newdouble[3]anArray:???length3012anArray:nullHere,thearrayisnotdefined.Here,thearrayisdefined,buttheelementsinthearrayareNOTdefined.164.1.4访问数组元素访问数组元素:数组名[索引值]例如:对前面所声明的primes数组,其第一个元素的引用是primes[0]若索引值小于0或大于最后一个的索引值,系统都会抛出一个异常(Exception)。抛出异常只是指示运行时错误的一种方式,不同种类的错误就有不同类型的异常,当程序抛出异常时,通常会被终止。174.1.4访问数组元素Ehaslength6;E[4]is14;Ifiis3,thenE[i]is-2;Assignavalue:E[5]=6.0Elength:6473-2146123450184.1.5数组变量的重用Java语言允许类型相同,而长度不同的两个数组互相赋值。赋值的结果是两个数组名指向同一数组。例如:int[]primes=newint[10];primes=newint[50];例如:double[]dub=newint[10];//illegal注意:可以改变数组变量所引用的数组,但是不可以改变数组元素所存储的值的类型。194.1.5数组变量的重用数组赋值只是对引用的复制B=Aresultsin:ABNOT:AB03length203length203length2Howcanwemakeacopyofanarray?204.1.6数组的初始化定义数组时直接初始化:如:int[]primes={1,2,3,4,5,6,7};//此数组为7个元素注意:初始化数组时,必须给出所有元素的值.若只对数组的部分元素指定初值,可以对这部分数组元素单独赋值,其它未赋值元素默认为0。例如:int[]primes=newint[100];primes[0]=1;或for(inti=0;iprimes.length;i)primes[i]=1;214.1.6数组的初始化使用实用方法初始化数组importjava.util.Arrays;Arrays.fill(primes,1);使用已有数组的引用来初始化数组变量long[]even={2L,4L,6L,8L};long[]value=even;分析:创建了____个数组变量,创建了____个数组.解答:两个数组变量都引用同一个数组,而且通过两个变量名都可以访问这个数组的元素。224.1.6数组的初始化例如:对非基本数据类型MyDate[]dates;dates=newMyDate[3];dates[0]=newMyDate(22,7,1964);dates[1]=newMyDate(1,1,2000);dates[2]=newMyDate(22,12,1964);或:MyDate[]dates={newMyDate(22,7,1964),newMyDate(1,1,2000),newMyDate(22,12,1964)};234.1.6数组的初始化数组交换的方法double[]input=newdouble[100];double[]output=newdouble[100];double[]temp;temp=input;input=output;output=temp;分析:是交换数组地址还是数组内容?解答:此种方法只是交换了数组在内存中的地址,没有移动任何数组元素。若要复制数组,则需定义同样大小的数组,并把原数组中的元素逐个复制到新数组中。244.1.6数组的初始化03length2A==BistrueA==BisfalseAB03length203length2AB03length2当两个数组之间进行比较和赋值的时候,只是两个数组的引用进行比较和赋值。(Itisthereferencesthatarecomparedorassigned,notthearrays.)254.1.7数组的使用double[]samples=newdouble[50];doubleaverage=0.0;for(inti=0;isamples.length;i++){samples[i]=100.0*Math.random();}for(inti=0;isamples.length;i++){average+=samples[i];}average/=samples.length;264.1.8嵌套数组二维数组:根据两个索引值的变化,可以访问数组的行或列。声明格式:类型说明符数组名[][];类型说明符[][]数组名;二维数组的初始化直接指定初值用new操作符274.1.8嵌套数组先声明数组再初始化数组数组名=new类型说明符[行数][];数组名=new类型说明符[行数][列数];例:intarra[][];//声明二维数组arra=newint[3][4];//初始化二维数组等价于:arra=newint[3][];arra[0]=newint[4];arra[1]=newint[4];arra[2]=newint[4];arra=newint[3][]for(inti=0;i3;i++){arra[i]=newint[4];}284.1.8嵌套数组定义二维数组也可以采用如下方式:float[][]temperature;temperature=newfloat[10][365];例题:气象迷程序见WeatherFan.javaint[][]arr=newint[][4];是否正确?294.1.8嵌套数组不同长度的嵌套数组在Java中,创建嵌套数组时,其中的各个数组的长度可以不同,例如:float[][]samples=newfloat[6][];则变量samples引用了一个具有6个元素的数组,其中每个元素可以容纳一个对一维数组的引用,可以单独定义这些数组,例如:samples[2]=newfloat[3];samples[5]=newfloat[10];304.1.8嵌套数组二维数组的各子数组元素的个数可以不同。例1:int[][]arr1={{3,-9},{8,0,1},{10,11,9,8}};例2:float[][]mat=newfloat[4][];for(inti=0;imat.length;i++)mat[i]=newfloat[i+1];float[]vector2=mat[1];0123matmat.length0010120123mat[0]mat[1](vector2)mat[2]mat[3]314.1.8嵌套数组分析如下代码的功能:float[][]samples=newfloat[6][];for(inti=0;isamples.length;i++)samples[i]=newfloat[i+1];for(inti=0;isamples.length;i++)for(intj=0;jsamples[i].length;j++)samples[i][j]=99.0f;324.1.8嵌套数组多维数组long[][][]beans=newlong[5][10][30];数组beans被定义为一个三维数组,也可以说其具有5个元素,每个元素都保存了一个对二维数组的引用,这些二维数组又可以互不相同。多维数组的使用方法与二维数组相似。例如:long[][][]beans=newlong[2][][];beans[0]=newlong[4][];beans[1]=newlong[2][];334.1.8嵌套数组字符数组char[]message=newchar[10];字符数组的初始化方法如下:char[]vowels={‘a’,‘e’,‘i’,‘o’,‘u’};也可以通过Arrays中的fill()方法进行填充,可以进行初始化。例如:Array.fill(vowels,‘a’);344.2字符串Java中普通字符串是String类的对象。String类是专门为创建和处理字符串而设计的,是Java自带的标准类String类在Java.lang包中