1、第5章 数组与字符串理解数组的概念,并能声明数组变量,创建数组实例,访问数组元素;掌握二维数组,并能创建二维数组实例,访问二维数组元素;掌握数组的相关操作与数组包装类Arrays,掌握不变字符串String类。学习目标:学习目标:n5.1 数组数组n5.2 二维数二维数组组n5.3 数组操作与数组包装类数组操作与数组包装类ArraysArraysn5.4 不变不变字符串类字符串类StringStringn5.5 实实训训n5.6 习题习题第第5章章 数组与字符串数组与字符串5.1.1 声明声明数组变量数组变量5.1.2 创建创建数组数组实例实例5.1.3 访问访问数组元素数组元素5.1 数组数
2、组 所谓数组就是相同数据类型的元素按一定顺序排列的集合。在Java语言中数组元素可以由简单数据类型的量组成,也可以由对象组成。数组中的每个元素都具有相同的数据类型,可以用一个数组名和一个下标来唯一确定数组元素的个数,即数组的长度。在Java语言中,数组的下标是从0开始的。如果需要在一个结构总存储不同类型的数据,或者需要长度可以动态改变的结构,可以考虑使用向量Vector类型。一维数组是一组相关变量的一维集合,其逻辑结构是线性表。要使用一维数组,需要经过定义、初始化和应用等过程。使用Java的数组,一般要经过3个步骤:声明数组、分配内存空间、数组元素赋值。前两个步骤的语法如下:在数组的声明格式里
3、,“数据类型”是声明数组元素的数据类型,可以是Java中任意的数据类型,包括简单类型和结构类型。“数组名”是用来统一这些相同数据类型的名称,其命名规则和变量的命名规则相同。指明该变量是一个5.1.1 声明声明数组数组变量变量 数组类型的变量,它可以放在数组名的前面,也可以放在数组名的后面。与c、c+不同,Java在数组的定义中并不为数组元素分配内存,因此 中不用给出数组中的个数(即数组的长度),但必须为它分配内存空间后才可使用。数组声明之后,接下来是要分配数组所需的内存,这时必须用运算符new,其中“个数”告诉编译器,所声明的数组要存放多少个元素,所以new运算符是通知编译器根据括号里的个数,
4、在内存中分配一块空间供该数组使用。利用new运算符进行数组元素占用内存空间分配的方式称为动态内存分配方式。下面举例来说明数组的定义,例如:在声明数组时,也可以将两个语句合并成一行,格式如下:利用这种格式在声明数组的同时,也分配一块内存供数组使用。如上面的两个语句可以写成如下的一句:Int x=new int10;下面是一维数组声明的几个例子。数组的定义和创建是有区别的,定义只需声明数组类型,并没有数组长度的要求。与对象引用的含义相同,仅表示某个数组,没有对应的内存空间。创建是给数组分配内存空间。它可以用new运算符,也可以用直接枚举初始化来创建。数组元素可以是基本数据类型,也可以是对象类型。对
5、数组元素直接枚举初始化来创建进行赋值,即在定义数组的同时进行初始化。例如:int a=1,2,3,4,5;用逗号(,)分隔数组的各个元素,系统自动为数组分配一定空间。5.1.2 创建数组创建数组实例实例例5.1 是创建一维数组的实例。解题思路:首先创建了一个一维数组anArray,然后通过for循环对数组中每个元素赋值并显示。代码:程序ArrayOne.javapublicpublic classclass ArrayOne publicpublic staticstatic voidvoid main(String args)intint anArray;/声明一个整数数组anArray=n
6、ewnew intint10;/创建一个整数数组对象forfor(intint i=0;ianArray.length;i+)anArrayi=i;/对数组元素赋值System.out.print(anArrayi+);System.out.println();运行结果如下:当定义了一个数组,并用运算符new为它分配了内存空间以后,就可以引用数组中的每个元素了。要想使用数组里的元素,可以利用数组名和下标来实现。数组元素的引用方式为:其中“下标”可以是整型或表达式。如a5+i(i为整数)。Java数组的下标是从0开始的。例如:int x=new int10;5.1.3 访问数组访问数组元素元素
7、其中x0代表数组中第1个元素,x1代表第2个元素,x9代表第10个元素,也就是最后一个元素。另外,与C、C+不同,Java对数组元素要进行越界检查以保证安全性。同时,对于每个数组都有一个属性length指明它的长度,如x.length指出数组x所含的元素个数。例5.2 数组中的每个元素赋值,然后按逆序输出。解题思路:声明一个一维数组,其长度为5,利用循环对数组元素进行赋值,然后再利用另一个循环逆循环输出数组元素的内容。代码:程序ArrayTest.javapublicpublic classclass ArrayTestpublicpublic staticstatic voidvoid ma
8、in(String args)intint i;intint a=newnew intint5;forfor(i=0;i=0;i-)System.out.println(a+i+=+ai);运行结果如下:例5.3 编写斐波那契(Fibonacci)数列的程序解题思路:斐波那契(Fibonacci)数列的定义公式为:F1=F2=1,Fn=Fn-1+Fn-2(n=3)代码:程序ClassFibonacci.java public public classclass ClassFibonacci publicpublic staticstatic voidvoid main(String args)
9、intint i;intint f=newnew intint10;f0=f1=1;forfor(i=2;i10;i+)fi=fi-1+fi-2;forfor(i=1;i=10;i+)System.out.println(F+i+=+fi-1);运行结果如下:5.2.1 声明声明数组变量数组变量5.2.2 创建创建数组实例数组实例5.2.3 访问访问数组元素数组元素5.2.4 案例案例一:员工工资存储系统一:员工工资存储系统5.2 二二维数维数组组 虽然一维数组可以处理简单的数据,但是在实际的应用汇总仍显不足,所以Java语言提供了多维数组。但在Java语言中并没有真正的多维数组,所谓多维数组
10、只是数组的数组。所谓二维数组,是指一个数组的元素是一维数组。二维数组以一维数组为基础扩展而来。以此类推,一维数组的多次嵌套定义构成了多维数组。二维数组的声明方式与一维数组类似,内存分配也一样用new运算符。其声明与分配内存的格式如下:与一维数组不同的是,二维数组在分配内存时,必须告诉编译器二维数组行与列的个数。因此在上面的格式中,“行数”是告诉编译器所声明的数组有多少行,“列数”则是赋值每行中有多少列,如:int a ;/声明整型数组a a=new34;/分配一块内存空间,供3行4列的整型数组a使用5.2.1 声明数组声明数组变量变量同样地也可以用较为简洁的方式来声明数组,其格式如下:以该种方
11、式声明的数组,在声明的同时就分配一块内存空间供该数组使用。如:int a =new int34;二维数组在实际的使用过程中也分为静态初始化和动态初始化两种。下面以初始化实例来加以说明:1.静态初始化实例 int number =1,2,3,4,5,6;Charch =a,b,c,d,e,f;上例是在建立数组的同时用大括号中的值给它赋初值,得到了两个二维整型数组和二维字符数组。2.动态初始化实例 int array_int=new int33;/定义数组并为 其分配存储空间 long array_long=new long555.2.2 创建数组创建数组实例实例例5.3 创建二维数组实例 解题思
12、路:首先静态初始化了一个两行三列的二维数组arr,并赋值,然后用双重for循环进行输出;接着动态初始化一个三行三列的二维数组num,并依此为每个元素赋值,最后也同样用双重for循环进行了值输出。程序代码:Array_2.java public public classclass Array_2 publicpublic staticstatic voidvoid main(String args)intint arr=1,2,3,4,5,6;/定义了两行三列的二维数组并赋值 forfor(intint x=0;xarr.length;x+)/定位行 forfor(intint y=0;yarr
13、x.length;y+)/定位每行的元素个数 System.out.print(arrxy+);System.out.println();charchar num=newnew charchar 33;/定义了三行三列的二维数组 num00=a;/给第一行第一个元素赋值 num01=b;/给第一行第二个元素赋值 num02=c;/给第一行第三个元素赋值 num10=d;/给第二行第一个元素赋值 num11=e;/给第二行第二个元素赋值 num12=f;/给第二行第三个元素赋值 num20=j;/给第三行第一个元素赋值 num21=h;/给第三行第二个元素赋值 num22=i;/给第三行第三个元
14、素赋值 forfor(intint x=0;xnum.length;x+)/定位行 forfor(intint y=0;ynumx.length;y+)/定位每行的元素个数 System.out.print(numxy+);System.out.println();运行结果如下:对二维数组进行初始化后,就可以在程序中引用数组的元素了。二维数组元素的引用是通过数组名和下标值来进行的,其一般格式如下:其中,Array_Name为数组名:index1为数组元素的高维下标;index2为数组的低维下标。二维数组中,下标同样是一个int类型数,也可以使用与int类型进行自动类型转换的类型,如short、
15、byte、char类型(使用时转换成int类型),但下标不能是long类型的数。5.2.3 访问数组访问数组元素元素 在Java中,并不要求多维数组的每一维长度相同。例如:Int array3=new int3;其对应的二维表如表8.1所示。表5.1 java中二维数组存储格式【说明】表5.1中并不要求n=m=k,实际应用中有可能nmk。例 5.4 矩阵相乘解题思路:两个矩阵Amn、Bnl相乘得到Cml,每个元素Cij=?aik*bk(i=1.m,n=1.n)程序代码:MatrixMultiply.java public public classclass MatrixMultiply pub
16、lic public staticstatic voidvoid main(String args)intint i,j,k;intint a=newnew intint23;intint b=1,5,2,8,5,9,10,-3,2,7,-5,-18;/矩阵B赋值 intint c=newnew intint24;for for(i=0;i2;i+)for for(j=0;j3;j+)aij=(i+1)*(j+2);/矩阵A赋值 for for(i=0;i2;i+)for for(j=0;j4;j+)cij=0;for for(k=0;k3;k+)cij+=aik*bkj;/矩阵C赋值 Sys
17、tem.out.println(n*MatrixA*);for for(i=0;i2;i+)for for(j=0;j3;j+)System.out.print(aij+);/输出矩阵A的值 System.out.println();System.out.println(n*MatrixB*);for for(i=0;i3;i+)for for(j=0;j4;j+)System.out.print(bij+);/输出矩阵B的值 System.out.println();System.out.println(n*MatrixC*);for for(i=0;i2;i+)for for(j=0;j4
18、;j+)System.out.print(cij+);/输出矩阵C的值 System.out.println();运行结果如下:【任务目的】掌握二维数组的声明与创建【任务要求】用户能够录入员工工资,并存储数据。【解题思路】员工人数作为数组索引,首先创建一个二维数组,然后用For循环对数组进行循环存储。代码:程序Salary.java importimport java.util.Scanner;public public classclass Salary 5.2.4 案例一:员工工资案例一:员工工资存储系统存储系统 public public staticstatic voidvoid ma
19、inmain(String args)Scanner scanner=newnew Scanner(System.in);System.out.print(请输入员工人数:);intint count=scanner.nextInt();String arr=newnew Salary().salaryArray(count);ifif(arr!=nullnull)System.out.println(已保存.);publicpublic String salaryArraysalaryArray(intint length)String arr=newnew Stringlength2;/定
20、义一个二维数组Scanner scanner=newnew Scanner(System.in);forfor(intint i=0;i arr.length;i+)/循环存储System.out.print(请输入员工姓名:);String name=scanner.next();arri0=name;System.out.print(请输入员工工资:);Double salary=scanner.nextDouble();arri1=salary.toString();returnreturn arr;运行结果为:5.3.1 数组数组遍历遍历5.3.2 数组数组排序排序5.3.3 数组数组
21、复制复制5.3.4 案例案例二:员工工资存储系统改版二:员工工资存储系统改版5.3 数组数组操作与数组包装类操作与数组包装类ArraysArrays 对数组的一些基本操作,像排序、搜索与比较等是很常见的。在Java中提供了Arrays类可以协助作这几个操作。Arrays类位于java.util包中能方便地操作数组,它提供的所有方法都是静态的,如表5.2所示,具有以下功能:表5.2 Arrays类提供的几个方法说明 遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现。遍历一维数组很简单,也很好理解,下面介绍遍历二维数组的方法。遍历二维数组需要使用双层for循环,通过数组的le
22、ngth属性可获得数组的长度。例5.5 遍历二维数组 解题思路:先定义二维数组,然后将二维数组中的元素呈 梯形输出。5.3.1 数组数组遍历遍历publicpublic classclass Trap publicpublic staticstatic voidvoid main(String args)intint b=newnew intint 1,2,3,4,5,6;/定义二维数组 forfor(intint k=0;kb.length;k+)forfor(intint c=0;cbk.length;c+)/循环遍历二维数组中的每个元素 System.out.print(bkc+);/将
23、数组中的元素输出 System.out.println();运行结果如下:通过Arrays类的静态sort()方法可实现对数组排序,sort()方法提供了许多重载形式,可对任意数组进行升序排序。语法如下:其中,object是指进行排序的数组名称。例5.6 对数组进行排序 解题思路:创建一维数组,并将数组排序后输出。代码:程序Asort.java5.3.2 数组排序数组排序importimport java.util.Arrays;publicpublic classclass Asort publicpublic staticstatic voidvoid main(String args)i
24、ntint arr=newnew intint23,45,10,6;/声明数组Arrays.sort(arr);/将数组进行排序forfor(intint i=0;iarr.length;i+)System.out.println(arri);/将排序后数组中的各个元素输出 运行结果如下:【说明】上述实例是对整数数组进行排序。Java中的String类型数组的排序算法是根据字典编排顺序排序的,因此数字排在字母前面,大写字母排在小写字母前面。Arrays类的copyOf()方法与copyOfRange()方法可实现对数组的复制。copyOf()方法复制数组指定长度,copyOfRange()方法
25、则将指定数组的指定长度复制到一个新数组中。1.copyOf()方法 该方法提供了很多种重载形式,来满足不同类型数组的复制。语法如下:copyOf(arr,int newlength)1)arr:要进行复制的数组。2)newlength:int型常量,指复制后的新数组的长度。如果 新数组的长度大于数组arr的长度,则用0填充(根据复制数组的类型来决定填充的值,整型数组用0填充,char型数组5.3.3 数组数组复制复制 则会使用null来填充);如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一元素开始截取至满足新数组长度为止。例5.7 实现数组的复制 解题思路:先创建一维数组,实
26、现将此数组复制得到一个长度是5的新数组,并将新数组输出。代码:程序Acopy.java import import java.util.Arrays;public public classclass Acopy publicpublic staticstatic voidvoid main(String args)intint arr=newnew intint23,32,10;intint newarr=Arrays.copyOf(arr,5);/复制数组arrforfor(intint i=0;inewarr.length;i+)System.out.println(newarri);/将
27、新数组输出运行结果如下:2.copyOfRange()方法 该方法同样提供了多种重载形式。语法如下:1)arr:要进行复制的数组对象。2)formIndex:指定开始复制数组的索引位置。formIndex必须在0至整个数组的长度之间。新数组包括索引是formIndex的元素。3)toIndex:要复制范围的最后索引位置。可以大于数组arr的长度。新数组不包括索引是toIndex的元素。例 5.8 实现将指定数组长度复制到一个新的数组 解题思路:先创建一维数组,并将数组中索引位置是0-4之间的元素复制到新数组中,最后将新数组输出。代码:程序Recopy.java import import ja
28、va.util.Arrays;public public classclass Recopy publicpublic staticstatic voidvoid main(String args)intint arr=newnew intint12,31,23,21,67,9;/定义数组intint newarr=Arrays.copyOfRange(arr,0,4);/复制数组 for for(intint i=0;inewarr.length;i+)System.out.println(newarri);运行结果如下:【任务目的】掌握二维数组的遍历,员工工资存储系统改版【任务要求】用户录
29、入员工工资后,打印显示【解题思路】员工人数作为数组索引,首先创建一个二维数组,然后用For循环对数组进行循环存储,最后用For循环对数组进行输出。代码:程序Salary2.javaimportimport java.util.Scanner;publicpublic classclass Salary2 5.3.4 案例案例二二:员工员工工资存储系统工资存储系统改版改版publicpublic staticstatic voidvoid mainmain(String args)Scanner scanner=newnew Scanner(System.in);System.out.print
30、(请输入员工人数:);intint count=scanner.nextInt();String arr=newnew Salary2().salaryArray(count);ifif(arr!=nullnull&arr.length!=0)newnew Salary2().salaryPrint(arr);System.out.println(已保存.);publicpublic String salaryArraysalaryArray(intint length)String arr=new Stringlength2;/定义一个二维数组 Scanner scanner=new Sca
31、nner(System.in);for(int i=0;i arr.length;i+)/循环存储System.out.print(请输入员工姓名:);String name=scanner.next();arri0=name;System.out.print(请输入员工工资:);Double salary=scanner.nextDouble();arri1=salary.toString();return arr;public void salaryPrint(String arr)for(int i=0;i arr.length;i+)System.out.println(员工姓名:+a
32、rri0+员工工资:+arri1);运行结果为:字符串是在Java中最常使用的对象,但也是最常被忽视的对象。字符串的本质是字符类型的数组。通常将字符串视为String类的一个实例,即将其视为存在于程序之中的对象。本节将会详细介绍字符串类String、字符串缓冲类StringBuffer、字符串建造类StringBuilder。这3种字符串都是16位的Unicode字符序列,并且这3个类都被声明为final类,因此不能被继承。String类是java.lang包中的一个final类,主要用来创建一个字符串对象。Java中的字符串使用String对象表示,也可以使用直接赋值方式创建,这不同于其他的
33、设计语言。例如,在C语言中字符串是一个字符数组,可以通过使用数组的方式来使用字符串。5.4 不变字符串类不变字符串类StringString 在Java语言中字符串必须包含在一对“”(双引号)之内。字符串是由许多个字符连接而成的。可以通过如下语法格式来声明字符串变量:String:指定该变量为字符串类型。str:任意有效的标识符,表示字符串变量的名称。null:如果省略null,表示str变量时未初始化的状态,否则表示声明的字符串的值就等于null。1.创建String对象 String类中提供了多种方法来创建String类的对象,如表5.3所示。表5.3 String类的构造方法例5.9 S
34、tring类的7种构造方法的使用 解题思路:用7种构造方法分别创建String类,其中s5是由字节数组byteArray创建的字符串,数组的每个字节的值代表汉子的国际机内码。代码:程序String1.java import import java.io.*;public public classclass String1 publicpublic staticstatic voidvoid main(String args)charchar charArray=b,i,r,t,h,d,a,y;bytebyte byteArray=-61,-26,-49,-14,-74,-44,-49,-13;
35、StringBuffer buffer;String s,s1,s2,s3,s4,s5,s6,s7;s=newnew String(hello);buffer=newnew StringBuffer(Welcome to you!);s1=newnew String();s2=newnew String(s);s3=newnew String(charArray);s4=newnew String(charArray,6,3);s5=newnew String(byteArray);s6=newnew String(byteArray,2,4);s7=newnew String(buffer)
36、;System.out.println(s1=+s1);System.out.println(s2=+s2);System.out.println(s3=+s3);System.out.println(s4=+s4);System.out.println(s5=+s5);System.out.println(s6=+s6);System.out.println(s7=+s7);运行结果如下:2.String类的常用方法 创建一个String类的对象后,使用相应类的成员方法创建的对象进行处理,即可完成编程所需要的功能。Java.lang.String类的常用成员方法如下表5.4所示:表5.4 S
37、tring类的常用方法例 5.10 String类的常用成员方法举例解题思路:先使用常用成员方法创建各对象,然后依次输出。publicpublic classclass String2 publicpublic staticstatic voidvoid main(String args)String s=I love you my baby!;intint len=s.length();charchar c=s.charAt(3);intint n1=s.indexOf(o);intint n2=s.indexOf(my,1);String s2=s.substring(6);String
38、s3=s.substring(6,11);System.out.println(s=+s+,length=+len);System.out.println(s.charAt(3)=+c);System.out.println(s.indexOf(0)=+n1);System.out.println(s.indexOf(my,1)=+n2);System.out.println(s.substring(6)=+s2);System.out.println(s.substring(6,11)=+s3);运行结果如下:实训:金额大小写转换【任务目的】通过数组实现数字的大小写转换【任务要求】掌握将数字
39、转换成中文金额的大写形式【解题思路】首先从命令行输入这个浮点数,判断该数据是否合法,若合法,将其转换为大写形式。代码:程序Trans2RMB.java public class Trans2RMB 5.5 实训实训public static void main(String args)System.out.println(n-将数字转换成中文金额的大写形式-n);Trans2RMB t2r=new Trans2RMB();String s=t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum();if(!.equals(s)System.o
40、ut.println(转换成中文后为:+s);System.out.println(n-);private String getNum()String s=null;System.out.println(请输入一个数字(精确到小数点后两位):);java.util.Scanner scanner=new java.util.Scanner(System.in);s=scanner.next();scanner.close();if(this.checkNum(s)return s;else return;private boolean checkNum(String s)try float f
41、=Float.valueOf(s);if(f 13)System.out.println(输入数据过大!(整数部分最多13位!));return;String smallOnly=s.substring(index+1);/如果小数部分大于两位,只截取小数点后两位if(smallOnly.length()2)String roundSmall=smallOnly.substring(0,2);s=intOnly+.+roundSmall;return s;private String numFormat(int flag,String s)int sLength=s.length();/货币大
42、写形式String bigLetter=零,壹,贰,叁,肆,伍,陆,柒,捌,玖;String unit=元,拾,佰,仟,万,拾,佰,仟,亿,拾,佰,仟,万;String small=分,角;/用来存放转换后的新字符串String newS=;for(int i=0;i sLength;i+)if(flag=1)newS=newS+bigLetters.charAt(i)-48+unitsLength-i-1;else if(flag=2)/转换小数部分(带单位)newS=newS+bigLetters.charAt(i)-48+smallsLength-i-1;return newS;priv
43、ate String cleanZero(String s)if(.equals(s)return;while(s.charAt(0)=零)s=s.substring(2);if(s.length()=0)return 零;String regex1=零仟,零佰,零拾;String regex2=零亿,零万,零元;String regex3=亿,万,元;String regex4=零角,零分;for(int i=0;i 3;i+)s=s.replaceAll(regex1i,零);for(int i=0;i 3;i+)s=s.replaceAll(零零零,零);s=s.replaceAll(零
44、零,零);s=s.replaceAll(regex2i,regex3i);for(int i=0;i 2;i+)s=s.replaceAll(regex4i,);s=s.replaceAll(亿万,亿);return s;运行结果为:一、选择题 1.数组中可以包含 类型的元素。A.int型 B.string型 C.数组 D.以上都可以 2.哪种方法返回String中的字符数?()A.size()B.length()C.width()D.girth()E.以上都不是 3.以下程序的执行结果为 。public class Testtt public static void main(Stirng args)int a=3,b=10;System.out.println(a+)*(-b);5.6 习题习题 A.40 B.36 C.20 D.27二、实践题 1.编写Java程序,创建数组arr1、arr2,将数组arr1中索引位置是03中的元素复制到数组arr2中,最后将数组arr1、arr2中元素输出。2.试编写程序,求下列5个正数:8、1、3.8、100.05、8的平均值,并输出大于其平均值的数。3.试编写程序,从命令行输入两个字符串,比较这两个字符串是否相等,并输出比较结果。4.试编写程序,从一个给定的字符串中删去某一给定的字符。