《Java6数组和字符串.ppt》由会员分享,可在线阅读,更多相关《Java6数组和字符串.ppt(99页珍藏版)》请在三一办公上搜索。
1、学习导读 数组、字符串都是使用Java语言编制程序要经常使用的数据结构,因此,熟练掌握这些数据结构是进一步学习Java程序设计的必要阶段。通过本章的学习,应该能够熟练掌握数组、字符串的各种基本操作。,第6章 数组、字符串,本章主要讲述如下内容:数组:Java的数组属于类类型;字符串的分类;内容不可改变的字符串类String;字符串常量;内容可以改变的字符串类StringBuffer;字符串应用。,第6章 数组、字符串,教学重点与难点:,一维数组的声明和初始化数组元素的引用二维数组的声明和使用字符与字符串的区别字符串常量与String类字符串变量与StringBuffer类,6.1 数组,Jav
2、a数组是系统定义类Array 的子类;数组的分类同C/C+:一维和多维。,6.1.1 一维数组,定义数组的格式:int a;或 int a;其值是null;在定义数组时不能指定大小。a仅是一个引用,代表一个数组名,但没有对应的空间。,产生数组空间的方法有两种:在定义时直接赋值:int a=1,2,3;通过new分配空间:int a=new int10;,数组元素的引用,定义并用运算符new为之分配空间后后,才可以引用数组中的每个元素;数组元素的引用方式:arrayNameindex index为数组元素下标,可以是整型常量或整型表达式。如a3,bi,c6*i;数组元素下标从0开始;长度为n的数
3、组合法下标取值范围:0 n-1;,数组元素的引用,int a=new int10;for(int i=0;ia.length;i+)ai=i;,int a;int a;a=new int3;a0=5;a1=11;a2=6;int a=new int3;int a=new int3;a0=5;a1=11;a2=6;int a=5,11,6;,注意:Java数组名是一个引用,当将一个数组名赋值给另一个数组时,实际上是名字的复制,例如 2-5:public class Test_Arraypublic static void main(String args)int a=1,2,3,b;b=a;fo
4、r(int i=0;i3;i+)b i+;for(int i=0;i3;i+)System.out.println(ai);,6.1.1 一维数组(续),获得数组元素的个数:数组名.length;一个整形数组若仅仅采用new分配空间,而没有对其赋值,那么每个元素的值是0。,int sourceArray=2,3,8,1,14;int destArray=new intsourceArray.length;for(int i=0;isourceArray.length;i+)destArrayi=sourceArrayi;,6.1.1 一维数组(续),int a=126,167,95;int m
5、ax=getMaxValue(a);System.out.println(Max=+max);public static int getMaxValue(int array)int m=array0;for(int i=1;i m)m=arrayi;return m;Output:Max=167,int a=126,167,95;destroy(a);System.out.println(a0+a1);.public static void destroy(int array)for(int i=0;i array.length;i+)arrayi=0;Output:0 0,6.1.2 二维数
6、组,数组中的数组元素可以是基本数据类型的值,也可以是对象类型的值。由于数组也是对象,因此,数组中的每个元素还可以是一个数组。,二维数组,二维数组举例:int a=1,2,3,4,0,9,5,6,7;,声明:int x;或int x;或 int x;,6.1.2 二维数组,产生二维数组空间的方法有两种:定义时直接赋值:x=1,2,3,4;int x=1,2,3,4;通过new运算符分配空间。,通过new运算符分配空间:x=new int23;或 x=new int2;x0=new int3;x1=new int3;,二维数组形状任意,不一定是矩形。例如程序2-7:,6.1.2 二维数组,publ
7、ic class Test_Array2 public static void main(String args)int a;a=new int2;a0=new int3;a1=new int6;(a 的长度=+a.length);System.out.println(a0 的长度=+a0.length);System.out.println(a1 的长度=+a1.length);,6.2 字符串,6.2 字符串,字符串指的是字符的序列,有两种类型的字符串:java.lang包中定义了 String和StringBuffer两个类;一种是创建以后不需要改变的,称为字符串常量,在Java中,St
8、ring类用于存储和处理字符串常量。另外一种字符串是创建以后,需要对其进行改变的,称为字符串变量,在Java中,StringBuffer类用于存储和操作字符串变量。两个类都有final修饰,这样可以优化字符串的操作。,6.2.1 String类,String类的定义原型:,public final class java.lang.String extends java.lang.Object,6.2.1 字符串常量,字符串常量属于String类型;相同的字符串常量属于同一个对象,占用同一块空间,例如:,/程序6-1public class TestConstString public stat
9、ic void main(String args)String str1=Hello,str2=Hello;System.out.println(str1=str2);System.out.println(Java=Java);,6.2.2 创建String类对象,用new运算符,并调用构造函数创建这种类型的对象,常见构造函数如下:,1.public String()采用该构造函数创建一个不含字符的空对象。例如:String str=new String();,2.public String(char value)将字符数组的内容转换为字符串,并赋予新建的对象。例如:char a=J,a,v,
10、a;String str=new String(a);3.public String(char value,int offset,int count)例如:char a=J,a,v,a;String str=new String(a,1,2);/字符串str的内容是av,4.public String(String value)采用value对象的值构造一个新的string对象。例如:String str1=Java;String str2=new String(Java);System.out.println(str2);/JavaSystem.out.println(str1=str2);
11、/false,下面是创建String对象的例子:String s;/声明一个String对象,此时s的值为空。s=new String(“abc”);/为s开辟内存空间,并初始化。String s=new String(“abc”);/把上两个语句的功能合二为一。,注意采用字符串常量初始化一个String引用的问题。例如:String str=abc;等价于:char data=a,b,c;String str=new String(data);应用举例,注意程序6-2的输出结果:,public class TestString/程序6-2 public static void main(St
12、ring args)String s1=Java,s2=Java;String s3=new String(s1);(s1=s2 is+(s1=s2);/true(s1=s3 is+(s1=s3);/falses1=ABC;s2=DEFG;(s1=s2 is+(s1=s2);/falses1=s2;(s1=s2 is+(s1=s2);/true,在Java中,String类包含有50多个方法来实现字符串的各种操作,以下介绍一些我们需要经常使用的方法。,6.2.3 String类常用方法,6.2.3 String类常用方法,1.public int length():求串长。例如:String
13、str=Java;System.out.println(str.length();/4,例子:String s=Hello!;System.out.println(s.length();/6String t=“你过得可好?”;System.out.println(t.length();/6,6.2.3 String类常用方法,2.public char charAt(int index)提取指定位置上的字符。String s=“This is a Test”;char c=s.charAt(3);/s 3.public int compareTo(String anotherString)对字
14、符串内容按字典序进行大小比较。例如:,3.字符串的比较:public int compareTo(String anotherString)其比较过程实际上是两个字符串中相同位置上的字符按Unicode中排列顺序逐个比较的结果。如果在整个比较过程中,没有发现任何不同的地方,则表明两个字符串是完全相等的,compareTo方法返回0;如果在比较过程中,发现了不同的地方,则比较过程会停下来,这时一定是两个字符串在某个位置上不相同,如果当前字符串在这个位置上的字符大于参数中的这个位置上的字符,compareTo方法返回一个大于0的整数,否则返回一个小于0的整数。,String s1=“aaaa”;S
15、tring s2=“AAAA”;int a=pareTo(s2);/32 String s3=“a1”;String s4=“a3”;int a=pareTo(s2);/-2,public class SortStringArrary/程序6-3 public static void main(String args)String str,s=Computer,CHINA,world,U.S.A;int i,j,k;System.out.print(排序之前:);for(i=0;i0)k=j;/sk中存放最小的 str=si;si=sk;sk=str;/注意该行的含义System.out.pr
16、int(n排序之后:);for(i=0;is.length;i+)System.out.print(t+si);,6.2.3 String类常用方法(续),4.char toCharArray()将String对象转换到一个字符数组中,例如:String s=Hello,Java!;char a;a=s.toCharArray();for(int i=6;ia.length;i+)System.out.print(ai);/Java!,6.2.3 String类常用方法(续),5.public boolean equals(String anString)比较两个字符串对象的内容是否相等。6.
17、public boolean equalsIgnoreCase(String anotherString)以忽略大小写方式,比较两个字符串对象的内容是否相等。注意:equals()方法与“=”之间的区别。例如:,String s1=“aaaa”;String s2=“AAAA”;boolean b1=s1.equals(s2);/false boolean b2=s1.equalsIgnoreCase(s2);/true,public class ConfuseQuestion/程序6-5 public static void main(String args)String s1=java;S
18、tring s2=new String(s1);String s3=s2;System.out.println(s1.equals(s2);/true System.out.println(s2.equals(s3);/true System.out.println(s2=s3);/true,6.2.3 String类常用方法(续),7.public int indexOf(int ch)在字符串中搜索字符,返回字符在String对象中从左边起首次出现的位置。如果没有出现,返回-1。,1)public int indexOf(int ch,int fromIndex)该方法和第一种方法类似,不
19、同的地方在于,该方法从fromIndex位置向后查找,返回的仍然是字符ch在字符串第一次出现的位置。2)public int lastIndexOf(int ch)该方法和第一种方法类似,不同的地方在于,该方法从字符串的左边位置向前查找,返回的是字符ch在字符串中最后一次出现的位置。3)public int lastIndexOf(int ch,int fromIndex)该方法和第二种方法类似,不同的地方在于,该方法以fromIndex位置为截止,返回的是字符ch在字符串中最后一次出现的位置。,String str=“This is a Test!”;int a=str.indexOf(s)
20、;/3int b=str.indexOf(s,4);/6int c=str.indexOf(“is”);/2int d=str.indexOf(“is”,4);/5,String str=“This is a Test!”;int a=str.lastIndexOf(s);/12 int b=str.lastIindexOf(s,4);/3 int c=str.lastIndexOf(“is”);/5 int d=str.lastIndexOf(“is”,4);/2,字符串中子串的查找 字符串中子串的查找与字符串中单个字符的查找十分相似,可以利用String类提供的下列方法:1)public
21、int indexOf(String str)2)public int indexOf(String str,int fromIndex)3)public int lastIndexOf(String str)4)public int lastIndexOf(String str,int fromIndex),例子:String s=“Java是面向对象的语言,JavaScript是脚本语言。”;int i=s.indexOf(“语言”);System.out.println(i);/10int j=s.indexOf(“语言”,12);System.out.println(j);/26cha
22、r c=s.charAt(5);System.out.println(c);/面,6.2.3 String类常用方法(续),8.public String substring(int begin,int end)从一个大的字符串中提取一个子串,提取string对象中从begin开始,到end-1结束的子串,返回提取的子串。String s=“12345”;String s1=new String();String s2=new String();s1=s.substring(0);/12345 s2=s.substring(1,3);/23,6.2.3 String类常用方法(续),9.pub
23、lic String concat(String str)将str对象接到调用对象的后面,返回新串。例如:String s1=Hello,s2=Java,s3;s3=s1.concat(s2);System.out.println(s3);/Hello Java注意:如果参数str为空(null),则concat方法不创建新串,而仅仅返回当前串,,例子:String s=Hello;System.out.println(s.concat(World!);System.out.println(s);,结果:Hello World!Hello,6.2.3 String类常用方法(续),10.pub
24、lic String replace(char oldChar,char newChar)将String对象中所有的oldChar字符替换为newChar,返回替换后的新串。例如:String path=d:/myjava/documents;System.out.println(path.replace(/,);/结果:d:myjavadocuments public String toString()返回当前字符串对象本身。,6.2.3 String类常用方法(续),12.public static String valueOf(各种类型 f)将各种数据类型转换成一个相应的字符串表示,该方
25、法是一个static方法。程序6-6演示了valueOf()方法的应用。程序6-7自学。,public class TestValueOf/程序6-6 public static void main(String args)char a=A,B,C,D,E,F;int i=123456;float f=3.14159f;boolean b=true;Object o=null;System.out.println(String.valueOf(a);System.out.println(String.valueOf(a,2,3);System.out.println(String.valueO
26、f(i);System.out.println(String.valueOf(f);System.out.println(String.valueOf(b);System.out.println(String.valueOf(o);,各种类型数据,public class str public static void main(String args)String str=Hello Java!;System.out.println(charAt(6)=+str.charAt(6);System.out.println(length=+str.length();System.out.print
27、ln(sub string=+str.substring(6);System.out.println(start with He=+str.startsWith(He);System.out.println(upper case=+str.toUpperCase();,charAt(6)=Jlength=12sub string=Java!start with He=trueUppercase=HELLO JAVA!,1)String s=new String();2)String t=new String(“Alpha”);3)s.length();/returns 0t.toLowerCa
28、se();/“alpha”./t is still a reference to“Alpha”5)(t.indexOf(“ha”);/36)(t.indexOf(“a”);/47)(s.indexOf(“ha”);/NullPointerException,public class StringDemo public static void main(String args)String s=Hello;char c=s.charAt(1);/e int d=s.length();/5 String r=s.substring(2);/llo boolean f=s.startsWith(He
29、);/true String t=s.toUpperCase();/HELLO,String s1=hello;String s2=hello;String s3=new String(hello);String s4=new String(hello);System.out.println(s1=s2);System.out.println(s1.equals(s2);System.out.println(s3=s4);System.out.println(s3.equals(s4);,true true false true,toString 方法,toString()方法在Object类
30、中定义,其返回值是String类型,描述当前对象的有关信息在进行String与其它类型数据的连接操作时,自动调用toString()方法可以根据需要在用户自定义类型中重写toString()方法基本类型数据转换为String类型时,调用了对应封装类的toString()方法,public class TestToString public static void main(String args)Student s=new Student(“J00123”,“张一,女);System.out.println(s);/直接调用toString函数 class Student public Stu
31、dent(String id,String name,String sex)this.id=id;this.name=name;this.sex=sex;public String toString()String result=我的名字是:+name+n+我的学号是:+id+n;return result;String id;String name;String sex;,我的名字是:张一我的学号是:J00123,每一个Java Application程序都有一个含有String args参数的main方法。该方法的说明如下:public static void main(String ar
32、gs);这个参数String args表示main方法接收了一个字符串数组,该字符串数组就是从命令行上传递过来的参数。由于Java Application程序可以用命令行来启动,所以命令行参数就成为向Java Application程序传递参数数据的一种方法。,6.2.4 Java应用程序的命令行参数,例,/Test.java class Test public static void main(String args)System.out.println(args0);System.out.println(args1);,javac Test.java java Test hi 9+8,Re
33、sults is:hi9+8,命令行参数,在启动Java应用程序时可以一次性地向应用程序中传递0多个参数-命令行参数命令行参数使用格式:java ClassName lisa bily Mr Brown命令行参数被系统以String数组的方式传递给应用程序中的main方法,由参数args接收 public static void main(String args),命令行参数用法举例,1 public class Test 2 public static void main(String args)3 for(int i=0;i args.length;i+)4 System.out.prin
34、tln(args+i+=+argsi);56 7/运行程序Test.javajava Test lisa bily Mr Brown/输出结果:args0=lisaargs1=bilyargs2=Mr Brown,6.3 StringBuffer类,StringBuffer类对象是一个内容可以改变的字符串。可以减少由于少量字符的插人而引起的空间分配问题。StringBuffer类的原型:,public final class java.lang.StringBuffer extends java.lang.Object,StringBuffer类对象的缓冲区,StringBuffer类对象有一
35、块缓冲区,字符串被存放在缓冲区中,缓冲区的大小可以随程序的需要进行调整。缓冲区的大小称为对象的容量。当修改对象的内容时,只要StringBuffer对象包含的字符个数没有超出容量,就不会分配新的空间,而直接在原空间内进行修改。若字符的个数超出了容量,该对象会自动调整其容量,从而适应新的存储。,6.3.1 创建StringBuffer类对象,StringBuffer类的构造函数有三种方式:,1.public StringBuffer()创建一个内容为空的StringBuffer对象,容量为16。例如:StringBuffer s=new StringBuffer();,6.3.1 创建Strin
36、gBuffer类对象(续),2.public StringBuffer(int length)初始内容为空,容量为length指定的大小。注意:length应大于等于0,不能为负数,否则会产生异常。例如:StringBuffer s2=new StringBuffer(2);,3.public StringBuffer(String str)初始内容和参数str的内容相同,容量为参数str的长度加上16。例如:String s1=Java;StringBuffer s2=new StringBuffer(s1);则s2的容量是20,内容是Java。,6.3.2 StringBuffer类常用方
37、法,1.public int length()返回字符串的长度 2.public int capacity()返回缓冲区大小3.public void setLength(int newLength)指定对象的长度,将对象的内容进行裁减。如果参数小于对象的长度,则将对象截断;如果参数大于等于对象的长度,则填充空字符(u0)扩充新增加的部分。,6.3.2 StringBuffer类常用方法(续),4.public void ensureCapacity(int NewCapacity)设定对象的缓冲区的大小,若参数 小于对象的容量,则新的设置将不起作用,也就是说容量只能扩大而不能缩小。程序6-9
38、演示了这几个方法的具体应用。,public class TestCapacity/程序6-9 public static void main(String args)String s=Java;StringBuffer str=new StringBuffer(s);System.out.println(Length=+str.length();/Length=4System.out.println(Capacity=+str.capacity();/Capacity=20,str.setLength(8);/设置长度为8str.ensureCapacity(80);/设置容量为80Syste
39、m.out.println(nstr=+str);/str=Java System.out.println(Length=+str.length();/Length=8System.out.println(capacity=+str.capacity();/capacity=80,str.setLength(3);str.ensureCapacity(20);System.out.println(nstr=+str);/str=JavSystem.out.println(Length=+str.length();/Length=3System.out.println(capacity=+str
40、.capacity();/capacity=80,6.3.2 StringBuffer类常用方法(续),5.public void setCharAt(int index,char ch)将参数index指定位置上的字符,设置成参数ch 指定的字符。例如:StringBuffer str=new StringBuffer(Hello,Java);str.setCharAt(3,L);则str的内容变成了HelLo,Java,例子:StringBuffer myStrBuff=new StringBuffer(goat);System.out.println(myStrBuff.toString
41、();myStrBuff.setCharAt(0,c);System.out.println(myStrBuff.toString();结果:goatcoat,6.3.2 StringBuffer类常用方法(续),6.public StringBuffer append(多种数据类型)将其它类型的数据添加到StringBuffer对象的尾部,返回修改后的StringBuffer对象。例如:StringBuffer s1,s2=new StringBuffer();s1=s2;/s1和s2代表同一个对象 s2.append(3.14).append().append(Java);System.o
42、ut.println(s1=s2);/输出true System.out.println(s1);/输出3.14 Java,append方法的实现技术内幕,append能自动调用String类中静态的方法valueOf(),从而将其它类型数据转换成String类的一个临时对象,然后将此临时对象添加到StringBuffer对象的尾部。,6.3.2 StringBuffer类常用方法(续),7.public String toString()该方法把StringBuffer对象的内容复制到一个新的String类对象中,返回这个新的String类对象。例如程序6-10。,public class
43、BufferToString/程序6-10 public static void main(String args)String s1;StringBuffer s2=new StringBuffer(Hello);s1=s2.append(Java!).toString();System.out.println(s1=+s1+s2=+s2);,程序输出结果:s1=Hello Java!s2=Hello Java!,6.3.2 StringBuffer类常用方法(续),8.public StringBuffer insert(int offset,多种类型 b)该方法是将一个其它类型的对象b插
44、入到offset指定的位置。例如:StringBuffer str=new StringBuffer(Java!);/将字符串Hello插入到下标为0的位置 str.insert(0,Hello);System.out.println(str=+str);输出结果为:str=Hello Java!,例子:StringBuffer myStrBuff=new StringBuffer();myStrBuff.append(Hello,Guys!);System.out.println(myStrBuff.toString();myStrBuff.insert(6,30);System.out.p
45、rintln(myStrBuff.toString();,结果:Hello,Guys!Hello,30 Guys!注意:println方法不接受StringBuffer类型的参数,若希望在屏幕上显示出来,必须先调用toString方法把它转换成字符串常量。,class StringBufferDemo public static void main(String args)StringBuffer t=new StringBuffer(moon/moon,public class strbff public static void main(String args)StringBuffer s
46、tr=new StringBuffer(moon,length=11moon&dogssgod&noomsgod&noom,6.3.3 String类中+操作的技术内幕,Java取消了运算符重载,但保留“+”和“+=”。String对象可以通过“+”或“+=”运算符连接字符串对象。通过实例分析“+”运算符。,public class PrintExampleExplain public static void main(String args)int x=0;int y=1;int z=2;String sString=x,y,z;System.out.println(sString+x+y+
47、z);/x,y,z012 System.out.println(y+z+sString);/3x,y,z System.out.println(y+z);/1 2 System.out.println(y+z);/12 System.out.println(y+z);/35 System.out.println(y+z);/error,public class Strings public static void test(String args)String s=new String(hello);String t=new String(hello);StringBuffer x=new S
48、tringBuffer(he);StringBuffer y=x;String s1=hello;String t1=s1;x.append(“llo);y.append(goodbye!);s.concat(goodbye!);t=s.concat(goodbye!);,判断:a)s=t/false b)s1=t1/true c)s=s1/false d)s.equals(t)/false e)x=y/true f)t.equals(y)/false,6.4 应用举例,例1:从键盘上读入一行文本,对其中的字母进行加密。加密原则是:将每个字母向后移动2位,例如:a变成c,X变成Z,Y变成A,z
49、变成b,非字母不改变。,/程序6-12import java.io.*;/为进行输入和输出引入I/O类 public class encipher static char cipher(int c)if(Character.isUpperCase(c)c=c+2;if(cZ)c=c-26;else if(Character.isLowerCase(c)c=c+2;if(cz)c=c-26;return(char)c;/将int转换为char,public static void main(String args)String line;StringBuffer buf;for(;)line=S
50、impleInput.readString();/读取一行字符 if(line.equals(quit)break;buf=new StringBuffer(line);for(int i=0;ibuf.length();i+)buf.setCharAt(i,cipher(buf.charAt(i);System.out.println(buf);,关键的一段,程序运行的示例结果:AaBbXxYyZz123456CcDdZzAaBb123456 quit,6.4 应用举例(续),例2自学。,本章小结,字符是指用单引号括起来单个字符,Java中的字符是指占2个字节的Unicode字符;字符串指的