资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,5,章 数组与字符串,5.1 数组,5.2 字符串,5.1,数组,5.1.1 数组定义及说明,5.1.2 数组应用举例,5.1.1 数组定义及说明,1,数组基本含义,同一类型数据元素的有限有序集合,元素的类型可以是基本数据类型或对象引用,可以随机访问数组中的元素。,在,Java,语言中,数组是以对象的形式存在。可以赋值给,Object,类型的变量,在数组中可以调用类,Object,的所有方法。,数组元素通过数组名字和非负整数下标值来引用。下标值起始值为,0,。,每个数组都有一个由,public final,修饰的成员变量:,length,,即数组含有元素的个数(,length,可以是正数或零),5.1.1 数组定义及说明,2数组声明,(1)一维数组声明,Type 数组名;,例如:,int a;,Type 数组名;,例如:,int a;,(2)二维数组声明,Type 数组名 ;,例如:,int a;,Type 数组名;,例如:,int a;,5.1.1 数组定义及说明,说明:,声明数组时无需指明数组元素的个数,也不为数组元素分配内存空间,Type为数组的类型,可以是基本数据类型也可以是引用类型,必须经过初始化分配内存后才能使用。,注意:,方括号中无数字,以下数组声明是错误的。,char s5;/W,5.1.1 数组定义及说明,3,数组创建,数组名,=new,数组元素类型,数组元素个数,说明:,(,1,)数组元素个数可以是常量,也可以是变量,。,s=new char 20;,或,int n,20;,s=new char n;,(,2,)声明和创建可合并,:,char s=new char 20,;,5.1.1 数组定义及说明,3,数组创建,(,3,)基本类型数组的每个元素都是一个基本类型的变量。引用类型数组的每个元素都是对象的引用。,例如:,class Point,int,x,,,y;,Point()x=67;y=10;,Point(int,x,int,y),this.x,=,x;this.y,=y;,5.1.1 数组定义及说明,3,数组创建,Point p ;/,语句组,1,p=new Point 100;/,语句组,1,创建了一个,100,个类型,Point,的变量。,注意:,并不创建,100,个,Point,对象;创建,100,个对象的工作必须分别完成如下:,p0=new Point();/,语句组,2,p99=new Point();/,语句组,2,执行语句组,1,P0,执行语句组,2,P0,0 x125,10,y,67,x,P1,0 xAE3,10,y,67,x,P99,0 xAF5,10,y,67,x,P0,P0,图,5-1,内存映像图,图,5-1,显示了执行语句组,1,、语句组,2,后的内存映像图,5.1.1 数组定义及说明,4数组元素的使用,用来指示单个数组元素的下标必须总是从0开始,任何访问在上述界限之外的数组元素的企图都会引起运行时出错。,使用length属性的例子如下:,int,list =new,int,10;,for(,int,i=0;i,list.length,;i+),System.out.println(listi,);,5.1.1 数组定义及说明,5数组的初始化,当创建一个数组时,每个元素都被初始化。,Java语言允许声明数组时初始化:,String names =Georgianna,Jen,Simon;,等同,于:,String names ;,names=new String 3;,names 0=,Georgianna,;,names 1=Jen;,names 2=Simon;,5.1.1 数组定义及说明,6多维数组,Java没有真正的多维数组,N维数组是N-1维数组的数组。,以下是矩阵数组例子:,int,twoDim,=new,int,4 ,twoDim0=new,int,5;,twoDim1=new,int,5;,twoDim2=new,int,5;,twoDim3=new,int,5;,5.1.1 数组定义及说明,6多维数组,以下是非矩阵数组例子:,int,twoDim,=new,int,4 ,twoDim0=new,int,2;,twoDim1=new,int,3;,twoDim2=new,int,4;,twoDim3=new,int,5;,x,0,0,0,1,1,0,1,1,1,2,2,0,2,1,2,2,2,3,3,0,3,1,3,2,3,3,3,4,数组列下标,数组行下标,图,5-2,非矩阵数组,内存映像图,5.1.1 数组定义及说明,7注意事项,不允许静态说明数组,下列声明是错误的。,char s5;/W,int,a154;/W,正确声明为,:,char s;/R,int,a1 ;/R,5.1.1 数组定义及说明,7注意事项,数组维数说明顺序应该从高到低,下列声明是错误的。,int a =new int 4;/W,正确声明为:,int a =new int4;/R,5.1.1 数组定义及说明,7注意事项,数组维数的指定只能出现在new运算符之后,下列声明是错误的。,int a 4=new int3 4;/W,正确声明为:,int a=new int3 4;/R,Java数组名是一个引用,当将一个数组名赋值给另一个数组时,实际上是名字的复制,。,5.1.2 数组应用举例,1,Java,数组名是一个引用,【,实例,5-1】,public class ArrayExample1,public static void,main(String,args,),int,a=10,20,30,40,b;,b=a;,for(int,i=0;i,b.length;i,+)b i=2*b i;,for(int,i=0;i,a.length;i,+),System.out.println(ai,);,5.1.2 数组应用举例,1,Java,数组名是一个引用,运行输出结果为:,20,40,60,80,说明:,【,实例,5-1】,中将数组,b,中的元素翻倍后,数组,a,中的元素也作了相应的变化,这是因为,a,和,b,都是引用,在这里指向同一对象。,5.1.2 数组应用举例,【实例5-2】,class A,void,square(int,c),int,i;,for(i,=0;i,c.length;i,+),ci,=,ci,*,ci,;,public class ArrayExample2,public static void,main(String,args,),A a=new A();,int,b=10,20,30,40;,a.square(b,);,for(int,i=0;i,b.length;i,+),System.out.println(bi,);,5.1.2 数组应用举例,【实例5-2】,运行输出结果为:,100,400,900,1600,说明,:【实例62】中将数组b中的元素在调用对象a中方法square后发生变化,这是调用方法时传递的是引用,即形参c和实参b在这里指向同一地址单元,这样当执行方法square时c指向单元的内容发生的任何改变必将影响数组b。,5.1.2 数组应用举例,2数组定义时数组元素大小可以是变量,【实例5-3】,public class ArrayExample3,public static void,main(String,args,),int,i,Num,=9,j;,for(j=1;j=Num;j+),int,b=new,intj,;,for(i,=0;i,b.length;i,+),bi,=i+1;,for(i,=0;i,b.length;i,+),System.out.print(i+1)+*+,bi,+=+(i+1)*,bi,+);,();,5.1.2 数组应用举例,2数组定义时数组元素大小可以是变量,【实例5-3】,5.1.2 数组应用举例,3二维数组是数组元素为一维数组的数组,【实例5-4】,public class ArrayExample4,public static void,main(String,args,),int,i,j,Num,=9;,int,b=new,intNum,;,for(j=1;j=Num;j+),bj-1=new,intj,;,for(i,=1;i=bj-1.length;i+)bj-1i-1=i*j;,5.1.2 数组应用举例,3二维数组是数组元素为一维数组的数组,【实例5-4】,for(j=1;j=,b.length,;j+),for(i,=1;i=bj-1.length;i+),System.out.print(i,+*+j+=+bj-1i-1+);,();,5.1.2 数组应用举例,3二维数组是数组元素为一维数组的数组,【实例5-4】,说明,:本例定义了一个不规则二维数组b,用于存储乘法表的结果,该二维数组实际上是一个原则为一维数组的一维数组,“b.length=9”表明数组b是元素个数为9的一维数组,“b0.length=1”表明数组元素b0是一个元素个数为1的一维数组,“b1.length=2”表明数组元素b1是一个元素个数为2的一维数组,依此类推,“b8.length=1”表明数组元素b8是一个元素个数为9的一维数组。,5.2,字符串,5.2.1 String类,5.2.2 StringBuffer类,5.2.3 字符串应用举例,5.2,字符串,字符串指的是字符的序列,String,类:用于存储和处理字符串常量,StringBuffer,类:用于存储和操作字符串变量,5.2.1 String类,一般说明:,Java,使用,java.lang,包中的,String,类,字符串常量,:,用双引号括住,,Hello World!,1,String,类的声明和创建,声明字符串,,如,String s;,创建字符串,:,String(,字符串常量,);,String(char a );/,字符数组,a,String(char a,int startIndex,int numChars);,String s=new String(“hello”);,或,String s=“hello”;,5.2.1 String类,2,String,类构造函数:,public String,(),:该构造函数用于创建一个空的字符串常量。,String empty=new String();,等价于使用直接量“”初始化字符串,String empty=“”;,public String,(,String value,),:该构造函数用于根据一个已经存在的字符串常量来创建一个新的字符串常量,该字符串的内容和已经存在的字符串常量一致。,public String,(,char a,)或,String(char a,int startIndex,int numChars),:该构造函数用于根据一个已经存在的字符数组来创建一个新的字符串常量。,5.2.1 String类,2,String,类构造函数:,char ch=H,e,l,l,o;,String helloString=new String(ch);,String heString=new String(ch,0,2);,System.out.println(helloString);,System.out.println(heString);,结果为:,Hello,he,public String,(,StringBuffer buffer,),:该构造函数用于根据一个已经存在的,StringBuffer,对象来创建一个新的字符串常量。,5.2.1 String类,3String类的常用方法,获取字符串的长度,String s=“Hello”;n=s.length();/结果5,判断字符串前缀或后缀与已知字符串是否相同,s.startsWith(“he”)/false,endsWith(“lo”)/true,比较两个字符串,:,s=“Hello”,s.equals(“Hello”)/true,s.equals(“hello”)/false,5.2.1 String类,3String类的常用方法,把字符串转化为数值,Integer.parseInt(“4567”);,Integer.parseLong(“123”);,Float.valueOf(“12.3”).floatValue();,Double.valueOf(“12.3”).doubleValue();,数值转化为字符串,String.valueof(123.567);,结果为”123.567”,替换字符、去掉字符串前后空格,s.replace(l,m);/l被m替换,s.trim();/去掉字符串s前后空格:,5.2.1 String类,3String类的常用方法,字符串检索,String s=“Hello”;,s.indexof(“l”);/值是2,s.indexof(“w”,2);/从第2位置开始,没有为-1,求字符串的子串,substring(int startpoint),substring(int start,int end),字符串连接,String s=“Hello!”;,String t=s.concat(“Susan.”);t的内容为“Hello!Susan”,5.2.1 String类,4字符串与基本数据类型间的转换,String类提供了以下静态方法获得其它基本数据类型值的字符串表示:,static String valueOf(boolean),static String valueOf(char),static String valueOf(float),static String valueOf(double),static String valueOf(int),static String valueOf(long),static String valueOf(Object),5.2.1 String类,4字符串与基本数据类型间的转换,除Boolean类外,每个包装器类都提供了一个静态方法 parseXXX,将字符串对象转换为对应的基本数据类型值,byte Byte.parseByte(String),int Integer.parseInt(String),long Long.parseLong(String),float Float.parseFloat(String),double Double.parseDouble(String),new Boolean(String).booleanValue(),5.2.1 String类,5关于String类的补充说明:,String类创建的字符串对象是不可修改的,也就是说,String字符串不能修改、删除或替换字符串中的某个字符,即String对象一旦创建,那么实体是不可以再发生变化的。,5.2.2 StringBuffer类,StringBuffer,类能创建可修改的字符串序列,也就是说,该类的对象的实体的内存空间可以自动的改变大小,便于存放一个可变的字符串。,1,StringBuffer,类的声明与创建,StringBuffer str;/,声明,str=new StringBuffer(“Hello”);/,创建,5.2.2 StringBuffer类,2StringBuffer类的构造方法,StringBuffer():,建立一个长度为16的字符缓冲区,StringBuffer(int size):,建立一个长度为size的字符缓冲区,StringBuffer(String s):,初始化缓冲区内容为给定的字符串s,并另外分配16个字符空间。当该对象的实体存放的字符序列的指定长度时,实体的容量自动地增加,以便存放所增加的字符。,5.2.2 StringBuffer类,3StringBuffer类的常用方法,public int length():,返回字符串的个数,public int capacity():,返回字符串缓冲区的程度,即总的可供分配的字符存储单元。,public StringBuffer append():,将指定的参数对象转化为字符串,附加到原来的字符串对象之后。,public char charAt(int n):,返回字符串中n位置上的字符,n的范围为0length()-1。,public void setCharAt(int n,char ch):,设置当前缓冲区第n位置的字符值为参数ch指定的值。,5.2.2 StringBuffer类,3StringBuffer类的常用方法,public StringBuffer insert(int index,Object obj):,将指定的对象转换为字符串,插入指定的位置。,public StringBuffer reverse():,StringBuffer对象使用reverse()方法将该对象实体中的字符翻转,并返回当前对象的引用。,StringBuffer delete(int start,int end):,删除从start到end-1的子字符串。,StringBuffer replace(int start,int end,String str):,将start到end-1之间的子字符串用str替换。,5.2.3,字符串应用举例,1.String,型字符串,【,实例,5-5】,public class StringExample1,public static void main(String,args,),String,str,=new String(A);,(,调用前,str,=+,str,);,operate(,str,);,(,调用后,str,=+,str,);,static void,operate(String,str1),str1=ABC;,System.out.println(str1=+str1);,5.2.3,字符串应用举例,1.String,型字符串,【,实例,5-5】,运行结果为:,调用前,str=A,str1=ABC,调用后,str=A,说明:,调用,operate,方法时,传入了引用,str,的拷贝,str1,,,str1,指向原引用,str,所指向的对象。执行语句“,str1=ABC;”,后,,str1,指向另一个新的对象,(,即字符串“,ABC”),,而引用,str,所指向的对象没有发生改变。,调用,operate,方法时,执行,operate,方法时,调用,operate,前,A,0 xc21,str1,0 x325,str,A,0 x325,str,调用,operate,后,A,0 x325,str,A,0 xc21,str1,0 x325,str,ABC,图,5-3,显示了程序执行中内存映像。,5.2.3,字符串应用举例,2.StringBuffer型字符串,【实例5-6】,public class StringBufferExample1,public static void main(String,args,),StringBuffer,a=new,StringBuffer,(A);,StringBuffer,b=new,StringBuffer,(B);,operate(,a,b,);,System.out.println(a,=+a+b=+b);,static void,operate(StringBuffer,x,StringBuffer,y),x.append(y,);,y=x;,System.out.println(x,=+x+y=+x);,5.2.3,字符串应用举例,2.StringBuffer型字符串,【实例5-6】,运行结果:,x=AB y=AB,a=AB b=B,说明:,调用operate方法时,传入了两个引用a,b的拷贝x,y,这两个x,y都指向原a,b引用所指向的对象。x.append(y)对它指向的对象(即a指向的对象)进行了操作。而x=y,只是两个拷贝变量在赋值,并没有影响到原b所指向的对象。所以b所指向的对象仍然为B。,调用,operate,方法时,执行,operate,方法时,调用,operate,前,A,0 xc21,x,0 x325,a,B,0 x315,y,0 x423,b,AB,0 xc21,x,0 x325,a,B,0 x315,y,0 x423,b,B,0 x423,b,A,0 x325,a,调用,operate,后,B,0 x423,b,AB,0 x325,a,5.2.3,字符串应用举例,3算术运算模拟,【实例5-7】,public class arithSimulateExample1,public static void main(String,args,),double data1,data2,result=0;,char operate=+;,boolean,flag=true;,if(,args.length,!=3),System.out.println(参数太少或太多,!);,flag=false;,3算术运算模拟,【实例5-7】,else,flag=false;,if(args0.equals(+)operate=+;flag=true;,if(args0.equals(-)operate=-;flag=true;,if(args0.equals(*)operate=*;flag=true;,if(args0.equals(/)operate=/;flag=true;,if(flag,=false),System.out.println(操作符不是,:+,-,*,/);,3算术运算模拟,【实例5-7】,if(flag),data1=Double.parseDouble(args1);,data2=Double.parseDouble(args2);,switch(operate,),case +:,result=data1+data2;,break;,case -:,result=data1-data2;,break;,case *:,result=data1*data2;,break;,3算术运算模拟,【实例5-7】,case /:,if(data2!=0),result=data1/data2;,else flag=false;,break;,if(flag),System.out.println(data1+args0+data2+=+result);,else,System.out.println(被零除,!);,5.2.3,字符串应用举例,3算术运算模拟,【实例5-7】,说明:,该程序是对+、-、*、/四种简单运算的模拟,在命令行输入类似“+1 2”的三个参数,即一个运算符和两个操作数,若参数个数多于或少于3个,程序会出错提示;若参数个数为3,但运算符不是+、-、*、/中的一个,程序也会出现错误提示;在进行除法运算时,若被除数为0,程序也会出现错误提示。,
展开阅读全文