java数组和字符串.ppt
第第4章章 数组和字符串数组和字符串数组数组数组说明数组说明一个数组是一系列的一个数组是一系列的匿名变量匿名变量,数组中的元素,数组中的元素可通过可通过下标下标来访问。来访问。在在Java中,数组是中,数组是对象对象。类类Object中定义的方法都可以用于数组。中定义的方法都可以用于数组。数组说明数组说明程序员可以说明任何类型的数组,数组元程序员可以说明任何类型的数组,数组元素可以是素可以是基本类型基本类型,也可以是,也可以是类类型类类型,当,当然还可以是然还可以是数组数组。例例char s ;Point points;s的每个元素都是的每个元素都是char类型的,类型的,points的的每个元素都是类每个元素都是类Point类型的。类型的。等价的数组说明等价的数组说明char s;Point points;这两行说明与前面的说明完全等价。这两行说明与前面的说明完全等价。创建数组创建数组和所有对象一样,程序中使用和所有对象一样,程序中使用new关键字创建数关键字创建数组,方括号中的数字表示数组元素个数。组,方括号中的数字表示数组元素个数。例:例:s=new char20;points=new Point100;points0=new Point();points1=new Point();Java中没有静态的数组定义,数组的内存都是通中没有静态的数组定义,数组的内存都是通过过new动态分配的。动态分配的。points(a)PointsLength:100(b)pointsLength:100X:Y:(c)Point类定义如下:类定义如下:class Point int x,y;Point(int x1,int y1)x=x1;y=y1;Point()this(0,0);图说明图说明说明语句说明语句:Point points;执行完毕,系统为变量执行完毕,系统为变量points分配一个引用空间。分配一个引用空间。说明语句说明语句:points=new Point 100;执行完毕,系统在内存中分配一个数组对象并把数组引执行完毕,系统在内存中分配一个数组对象并把数组引用赋给变量用赋给变量points,说明语句说明语句:points1=new Point();执行完毕,数组的状态图执行完毕,数组的状态图4-1(b)变为图)变为图4-1(c)。)。数组说明与数组创建可以合并:数组说明与数组创建可以合并:char s =new char 20;Point points =new Point 100;数组变量的类型可以不同于所指向的数组类,但数组变量的类型可以不同于所指向的数组类,但应该是它的父类。应该是它的父类。例如:例如:Object points;points=new Point 100;例如:例如:Point points;points=new Object 100;正确正确错误错误数组边界数组边界在在Java中,数组中,数组下标从下标从0开始开始。数组中的元素个数数组中的元素个数length是数组类中唯一是数组类中唯一的数据成员变量。的数据成员变量。使用使用new创建数组时系统创建数组时系统自动给自动给length赋值赋值。数组一旦创建完毕,其大小就固定下来。数组一旦创建完毕,其大小就固定下来。程序运行时使用程序运行时使用length进行数组进行数组边界检查边界检查。如果发生越界访问,则抛出一个异常。如果发生越界访问,则抛出一个异常。示例示例int list =new int 10;for(int i=0;i list.length;i+)/进行相应处理的代码进行相应处理的代码循环的结束条件中使用循环的结束条件中使用list.length,而不是常数,而不是常数10。好处好处:不会引起数组下标越界,使程序更健壮,:不会引起数组下标越界,使程序更健壮,修改更方便。修改更方便。数组初始化数组初始化数组名加上下标可以表示数组元素。数组名加上下标可以表示数组元素。数组的下标范围为数组的下标范围为0到到length-1。当创建一个数组时,每个元素都被初始化。当创建一个数组时,每个元素都被初始化。Java允许用初值来创建数组。允许用初值来创建数组。示例示例String names =Georgianna;Jen;Simon;Tom;静态初始化静态初始化静态初始化静态初始化可用于任何元素类型,初值块可用于任何元素类型,初值块中每个位置的每个元素对应一个引用。中每个位置的每个元素对应一个引用。names=new String4;names0=Georgianna;names1=Jen;names2=Simon;names3=Tom;多维数组多维数组Java可以建立数组的数组(的数组可以建立数组的数组(的数组),由此得到),由此得到多维数组多维数组。一般来讲,一般来讲,n维数组是维数组是n-1维数组的数维数组的数组组。说明多维数组时使用说明多维数组时使用类型及多对方括类型及多对方括号号。多维数组可以从最高维起,分别为每一维多维数组可以从最高维起,分别为每一维分配内存分配内存。示例示例int twoDim =new int 4;twoDim0=new int5;twoDim1=new int5;二维数组二维数组创建创建二维数组的一般格式二维数组的一般格式为:为:type arrayN =new type arrleng1 ;arrayN 0=new type arrleng2;arrayN 1=new type arrleng2;.arrayN arrleng1-1=new type arrleng2;非矩阵数组非矩阵数组在在Java中还可以创建中还可以创建非矩阵数组非矩阵数组。例例4-4int twoDim =new int 4 ;twoDim0=new int2;twoDim1=new int4;twoDim2=new int6;twoDim3=new int8;twoDim数组为数组为4行,每行的元素个数分别行,每行的元素个数分别为为2,4,6,8个,各不相同。个,各不相同。数组形式数组形式如下:如下:X XX X X XX X X X X XX X X X X X X X 该数组各维的长度如下该数组各维的长度如下twoDim.length=4twoDim0.length=2twoDim1.length=4twoDim2.length=6twoDim3.length=8二维矩阵数组说明二维矩阵数组说明二维矩阵数组的一般说明格式为二维矩阵数组的一般说明格式为type arrayName =new type length1length2;其中,其中,arrayName是数组名,是数组名,length1和和length2分别为数组各维的大小,分别为数组各维的大小,type是数组是数组元素的类型。元素的类型。例例4-5int matrix =new int 45;将创建一个有将创建一个有4个数个数组的数组,每个数组组的数组,每个数组中又有中又有5个整数,即个整数,即4行行5列的整数矩阵。列的整数矩阵。等价于等价于:int matrix =new int 4;for(int j=0;j matrix.length;j+)matrix j =new int5;多维数组的初始化多维数组的初始化多维数组的初始化与一维数组类似,多维数组的初始化与一维数组类似,以二维数组静态初始化为例:以二维数组静态初始化为例:int a =2,3,1,5,3,4;它的形式如下:它的形式如下:2 31 53 4使用两个下标可以访问数组中的任一元素。使用两个下标可以访问数组中的任一元素。正确的说明示例正确的说明示例int a1 =new int 23;int a2 =new int 2 ;int a3 =new int 46;不正确的说明示例不正确的说明示例int errarr123;int errarr2 =new int 4;int errarr3 4=new int 34;不允许静态不允许静态说明数组说明数组。数组的维数说数组的维数说明顺序应从高明顺序应从高维到低维。维到低维。数组数组维数的指定维数的指定只能出现在只能出现在new运运算符之后。算符之后。数组拷贝数组拷贝数组创建后就不能改变它的大小,但是可数组创建后就不能改变它的大小,但是可以使用相同的引用变量指向一个全新的数以使用相同的引用变量指向一个全新的数组。组。int elements =new int6;elements=new int10;Java在在System类中提供了一个特殊的方法类中提供了一个特殊的方法arraycopy(),它实现数组之间的拷贝。,它实现数组之间的拷贝。示例示例class ArrayTestpublic static void main(String args)/初始数组初始数组int elements =1,2,3,4,5,6;/./增大后的新数组增大后的新数组int hold =10,9,8,7,6,5,4,3,2,1;/把把elements数组中的所有元素复制到数组中的所有元素复制到/hold数组中,下标从数组中,下标从0开始开始System.arraycopy(elements,0,hold,0,elements.length);数组数组hold的内容为:的内容为:1,2,3,4,5,6,4,3,2,1。4.2字符串类型字符串类型Java中提供了中提供了String和和StringBuffer类型,它们类型,它们都是类。都是类。字符串字符串是内存中连续排列的一个或多个字符。是内存中连续排列的一个或多个字符。Java提供的标准包提供的标准包java.lang中封装了类中封装了类String和和StringBuffer,分别用于处理不变字符串和可变,分别用于处理不变字符串和可变字符串。字符串。不变字符串不变字符串是指字符串一旦创建,其内容就不能是指字符串一旦创建,其内容就不能改变。改变。字符串说明及初始化字符串说明及初始化Java程序中的字符串分程序中的字符串分常量常量和和变量变量两种。两种。系统为程序中出现的字符串常量自动创建系统为程序中出现的字符串常量自动创建一个一个String对象。对象。如:如:System.out.println(This is a String);将创建将创建This is a String对象,这个创建过程对象,这个创建过程是隐含的。是隐含的。字符串的说明字符串的说明字符串的字符串的说明说明很简单:很简单:String s1;StringBuffer sb1;创建一个创建一个空的字符串空的字符串:String s1=new String();由由字符数组字符数组创建字符创建字符char chars =a,b,c;String s2=new String(chars);可以直接用可以直接用字符串常量字符串常量来初始化一个字符来初始化一个字符串:串:String s3=Hello World!;字符串处理字符串处理字符串创建以后,可以使用字符串类中的字符串创建以后,可以使用字符串类中的方法对它进行操作。方法对它进行操作。String类类String类类的对象实例是不可改变的,一旦创的对象实例是不可改变的,一旦创建,就确定下来。建,就确定下来。String类中类中常用的方法常用的方法有:有:length()返回字符串中的字符个数。返回字符串中的字符个数。charAt(int index)返回字符串中返回字符串中index位置的位置的字符。字符。toLowerCase()将当前字符串中所有字符转换将当前字符串中所有字符转换为小写形式。为小写形式。toUpperCase()将当前字符串中所有字符转换将当前字符串中所有字符转换为大写形式。为大写形式。subString(int beginIndex)截取当前字符串中截取当前字符串中从从beginIndex开始到末尾的子串。开始到末尾的子串。replace(char oldChar,char newChar)将当前将当前字符串中出现的所有字符串中出现的所有oldChar转换为转换为newChar。还有还有getChars(),indexOf(),getBytes()等许等许多方法。多方法。字符串操作示例字符串操作示例public class StringTest public static void main(String args)String s=This is a test String!;System.out.println(before changed,s=+s);String t=s.toLowerCase();System.out.println(after changed,s=+s);System.out.println(t=+t);执行结果为:执行结果为:before changed,s=This is a test String!after changed,s=This is a test String!t=this is a test string!StringBuffer类类StringBuffer类处理类处理可变字符串可变字符串,当修改一,当修改一个个StringBuffer类的字符串时,不用再创建类的字符串时,不用再创建一个新的字符串对象,而是直接操作原字一个新的字符串对象,而是直接操作原字符串。符串。Java为为StringBuffer类提供的方法不同于类提供的方法不同于String类中的方法。类中的方法。系统为系统为String类对象分配内存时,按照对象类对象分配内存时,按照对象中所含字符的实际个数等量分配。中所含字符的实际个数等量分配。而为而为StringBuffer类对象分配内存时,除去类对象分配内存时,除去字符所占空间外,再另加字符所占空间外,再另加16个字符大小的个字符大小的缓冲区缓冲区。对于对于StringBuffer类对象,使用类对象,使用length()方方法可获得字符串的长度,另外,还有法可获得字符串的长度,另外,还有capacity()方法返回缓冲区的容量。方法返回缓冲区的容量。一般地,一般地,StringBuffer的的长度长度是指存储在其是指存储在其中的字符个数,中的字符个数,容量容量是指缓冲区所能容纳是指缓冲区所能容纳的最大字符数。的最大字符数。几个特殊处理几个特殊处理连接连接String类对象可以使用类对象可以使用concat(String str)方法方法将将str连接在当前字符串的尾部。连接在当前字符串的尾部。例例String s=This is the;String t=s.concat(String.);t的内容为:的内容为:This is the String.系统还提供了实现连接的简单操作,即重系统还提供了实现连接的简单操作,即重载运算符载运算符“+”。“+”除了能实现数值加法外,还可连接它除了能实现数值加法外,还可连接它的两个操作数。的两个操作数。只要只要“+”的两个操作数中有一个是字符串,的两个操作数中有一个是字符串,则另一个也自动变为字符串类型。则另一个也自动变为字符串类型。StringBuffer类对象使用类对象使用append()方法实现连接。方法实现连接。例如:例如:age是是int型量,值为型量,值为36,String s=He is+age+years old.;String s=new StringBuffer(He is).append(age).append(years old.).toString();完全等价完全等价比较比较String类中有多个比较方法:类中有多个比较方法:compare To(),equals(),equalsIgnoreCase(),regionMatches()它们可用来实现字符串的比较。这几个方法判定它们可用来实现字符串的比较。这几个方法判定要比较的两个实例内容是否符合条件。要比较的两个实例内容是否符合条件。示例示例/程序程序4-3class StringTestpublic static void main(String args)String str=This is the first string.;boolean result1=str.equals(This is the first string.);boolean result2=str.equals(this is the first string.);boolean result3=str.equalsIgnoreCase(this is the first string.);System.out.println(result1=+result1);System.out.println(result2=+result2);System.out.println(result3=+result3);执行结果为:执行结果为:result1=trueresult2=falseresult3=trueJava中可以使用关系运算符中可以使用关系运算符“=”判定两判定两个字符串是否相等。个字符串是否相等。与与equals()方法不同的是,方法不同的是,“=”判定两字判定两字符串对象是否是同一实例,即它们在内存符串对象是否是同一实例,即它们在内存中的存储空间是否相同。中的存储空间是否相同。程序程序4-4class StringTest2public static void main(String args)String s1=This is the second string.;String s2=This is the second string.;String s3=new String(This is the second string.);String s4=new String(s1);String s5=s1;boolean result121=s1.equals(s2);boolean result122=s1=s2;boolean result131=s1.equals(s3);boolean result132=s1=s3;boolean result141=s1.equals(s4);boolean result142=s1=s4;boolean result151=s1.equals(s5);boolean result152=s1=s5;System.out.println(s1 equals s2=+result121);System.out.println(s1=s2=+result122);System.out.println(s1 equals s3=+result131);System.out.println(s1=s3=+result132);System.out.println(s1 equals s4=+result141);System.out.println(s1=s4=+result142);System.out.println(s1 equals s5=+result151);System.out.println(s1=s5=+result152);执行结果为:执行结果为:s1 equals s2=trues1=s2=trues1 equals s3=trues1=s3=falses1 equals s4=trues1=s4=falses1 equals s5=trues1=s5=true