《数组字符串向量.ppt》由会员分享,可在线阅读,更多相关《数组字符串向量.ppt(33页珍藏版)》请在三一办公上搜索。
1、第5章数组、字符串、向量,继承性和多态性,2,主要内容,5.1 数组一维数组二维数组5.2 字符串字符串常量String类StringBuffer类StringTokenizer类5.3 向量,继承性和多态性,3,5.1 数组,数组是有序数据的集合,是由数目固定、相同类型的元素组成的,用一个统一的数组名和下标来唯一地确定数组中的元素。Java将数组作为对象来处理,数组是一种引用类型,从java.lang.Object继承而来,故Object类中的所有方法均可用。,继承性和多态性,4,5.1.1 一维数组,具有一个下标的数组称为一维数组。1.一维数组的声明其声明格式如下:这里只有数组变量的定义,
2、没有为数组元素分配空间,只为数组的引用分配了空间,array1和array2目前为空的引用。,方式一:数据类型 数组名;方式二:数据类型 数组名;例如:int array1;double array2;,继承性和多态性,5,一维数组,2.一维数组的初始化数组经过初始化后,其长度(即可存放的元素个数)就不可再改变。数组的初始化分为静态初始化和动态初始化两种:(1)静态初始化:在定义数组的同时对数组元素进行初始化 int intArray=1,2,3,4;/定义了一个含有4个元素的int型数注:在给数组赋初值时,不能同时指定数组的大小,Java会根据初值的多少自动计算数组的大小。静态初始化必须使用
3、上述一条语句完成 当创建数组后,如果没有初始化,系统会根据数组的不同数据类型,指定不同的缺省值。,继承性和多态性,6,一维数组,(2)动态初始化:用运算符new为数组分配空间 对于简单类型的数组,其格式如下:数据类型 数组名=new 数据类型arraySize;数据类型 数组名=new 数据类型arraySize;或先声明数组,再对数组进行初始化:数据类型 数组名;数组名=new 数据类型arraySize;,继承性和多态性,7,一维数组,对于复合(引用)类型(类、接口、数组)的数组,需要经过以下两步进行内存空间的分配。1.为数组分配空间:数组名=new 数据类型arraySize;2.为每一
4、个数组元素分配所引用的对象空间:数组名i=new 数组元素对象的构造函数;例:string stringArray;/定义一个String类型的数组stringArray=new String3;/分配3个引用空间,初始化每个引用值为nullstringArray0=new String(how);stringArray1=new String(are);stringArray2=new String(“you”);(如图示),继承性和多态性,8,一维数组,3.一维数组元素的的引用当数组初始化后就可通过数组名与下标来引用数组中的每一个元素。一维数组元素的引用格式如下:数组名int类型的表达式注
5、意:(1)与C/C+不同的是,Java对数组元素的下标要进行越界检查,以保证访问的安全性。若数组下标越界,Java会抛出 java.lang.ArrayIndexOutOfBoundsException异常。(2)length是属于数组对象的数据域而不是方法。因此,使用length()会出错,应使用数组名.length,且只有在数组创建后才能访问。创建前,数组的引用是null。(3)与C、C+中不同,Java对数组元素要进行越界检查以保证安全性。,继承性和多态性,9,一维数组,4.数组的复制一个简单的赋值语句并不能完成数组复制工作,在Java中,可以使用赋值语句复制基本类型的变量却不能复制对象
6、,如数组。将一个对象赋值给另一个对象,只会使两个对象指向相同的内存地址。赋值数组有以下三种方法:(1)用循环语句复制数组的每一个元素,如for(int i=0;isourceArray.length;i+)targetArrayi=sourceArrayi;(2)使用Object的clone方法,如:int targetArray=(int)sourceArray.clone();(3)使用System类中的静态方法arraycopy,arraycopy的语法如下:arraycopy(sourceArray,srcpos,targetArray,tarpos,length);,继承性和多态性,
7、10,一维数组,5.程序举例【例5.2】用数组求解Fibonacci数列的前20项,即使用数组下标表达式求解数学上的迭代问题。,public class Fibonacci public static void main(String args)int i;int f=new int20;f0=1;f1=1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)if(i%5=0)System.out.println();System.out.print(fi+t);System.out.println();,继承性和多态性,11,图5.2 对5个数据进行冒泡法排
8、序,【例5.3】用冒泡法和选择法两种方法对N个数排序(升序)。,继承性和多态性,12,5.1.2 二维数组,如果数组的元素类型也是数组,这种结构就是多维数组。可以为二维、三维等。最常用的二维数组的每个元素都是一个一维数组,又叫做数组的数组。表示矩阵或表格需要使用二维数组。1.二维数组的声明,数据类型 数组名;或数据类型 数组名;例如:int arr;或 int arr;,继承性和多态性,13,二维数组,2.二维数组的初始化二维数组的初始化也分为静态初始化和动态初始化两种。(1)静态初始化:在定义数组的同时为数组分配空间,例如:int intArray=1,2,2,3,3,4;(2)动态初始化:
9、对高维数组来说,动态分配内存空间有下面两种方法:直接为每一维分配空间,格式如下:数据类型 数组名=new数据类型数组长度;或数据类型 数组名=new 数据类型数组长度数组长度;例如:int intArray1=new int4;int intArray2=new int43;int arr=new int4;/错误,继承性和多态性,14,二维数组,从最高维开始(而且必须从最高维开始),分别为每一维分配空间。第2维的每一个数组的长度可以不同,是一个不规则的二维数组。例如:String s=new String2;s0=new String2;s1=new String3;s00=new Stri
10、ng(Good);s01=new String(Luck);s10=new String(to);s11=new String(you);s12=new String(!);,继承性和多态性,15,二维数组,3.二维数组的引用对二维数组中的每个元素,引用方式为:数组名index1index2二维数组也有length属性,可以求每一维数组的长度。对于:int x=new int34;,继承性和多态性,16,二维数组,【例5.5】测定数组的长度及数组赋值。public class twoDimensionArray public static void main(String arg)int ma
11、trix=1,2,3,4,5,2,3,4,5,3,4,5,4,5,5 System.out.println(the length of matrix is+matrix.length);for(int i=0;i5;i+)System.out.println(the length of matrix+i+is+matrixi.length);,继承性和多态性,17,二维数组,【例5.6】求二维数组中的最大数。class Maxvalue int maxvl(int arr1)int i,k,max;int len=arr1.length,len1;max=arr100;for(i=0;imax
12、)max=arr1ik;return max;,【例5.7】矩阵的加法和乘法运算。public static int addMatrix(intm1,intm2)int result=new intm1.lengthm10.length;for(int i=0;im1.length;i+)for(int j=0;jm10.length;j+)resultij=m1ij+m2ij;return result;public static int multiplyMatrix(intm1,intm2)int result=new intm10.lengthm2.length;for(int i=0;
13、im1.length;i+)for(int j=0;jm20.length;j+)for(int k=0;km10.length;k+)resultij+=m1ik*m2kj;return result;,继承性和多态性,18,5.2 字符串,字符串是多个字符的序列,是编程中常用的数据类型。在纯面向对象的Java语言中,将字符串数据类型封装为字符串类,无论是字符串常量还是字符串变量,都是用类的对象来实现的,在对象中封装了一系列方法来进行字符串处理。,继承性和多态性,19,5.2.1 字符串常量,字符常量是用单引号括住的一个字符。字符串常量使用双引号括住的一串字符,一个String对象,可以使用
14、String类中的各种方法。注意:若Java程序中多处出现字符串常量如“ABC”,则Java编译程序只创建一个String对象,所有的字符串常量“ABC”将使用同一个String对象。如:String s1=ABC;String s2=ABC;String s3=new String(ABC);创建了三个对象,其中s1和s2是同一个对象,而s1和s3是2个不同的对象,,继承性和多态性,20,5.2.2 String类,1.String类的构造方法String类中提供了多种构造方法来创建String类的对象。(1)public String();创建一个字符串对象,其字符串值为空。(2)publ
15、ic String(String value);用字符串对象value创建一个新的字符串对象。(3)public String(char value);用字符数组value来创建字符串对象。(4)public String(char value,int offset,int count)从字符数组value中下标为offset的字符开始,创建有count个字符的字符串对象。(5)public String(byte ascII)用byte型字符串数组ascII,按缺省的字符编码方案创建字符串对象。(6)public String(byte ascII,int offset int count)
16、从ascII中下标为offset的字符开始,创建count个字符的串对象。(7)public String(StringBuffer buffer)用缓冲字符串buffer创建一个字符串对象。,继承性和多态性,21,String类,【例5.8】String类的构造方法的使用。import java.io.*;public class useOfStringConstructor public static void main(String args)char charArray=H,e,l,l,o,W,o,r,l,d;byte byteArray=-61,-26,-49,-14,-74,-44
17、,-49,-13;StringBuffer buffer;String s,s1,s2,s3,s4,s5,s6,s7,ss;s=new String(hello);/由于字符串经常使用,所以此语句经常简化为s=hello;ss=ABC;buffer=new StringBuffer(Welcom to java programming!);s1=new String();s2=new String(s);s3=new String(charArray);s4=new String(charArray,6,5);s5=new String(byteArray);s6=new String(byt
18、eArray,4,4);s7=new String(buffer);。,继承性和多态性,22,String类,2.String类的常用成员方法创建一个String类的对象后,使用相应类的成员方法对创建的对象进行处理。String类的常用成员方法见表5.3。说明:(1)关于字符串比较的说明不能用“=”,而用equals()方法。(2)程序设计中频繁使用字符串。(3)类型转换String类的静态方法valueOf()实现简单数据转化为字符串。类Integer、Double、Float和Long中也提供了方法valueOf()把一个字符串转化为对应的数字对象类型,继承性和多态性,23,String类
19、,示例:参看例5.10 public static boolean isPalindrome(String s)int low=0;/字符串中第一个字符的下标 int high=s.length()-1;/字符串中最后一个字符的下标 while(low high)if(s.charAt(low)!=s.charAt(high)return false;/不是回文串 low+;high-;return true;/是回文串,继承性和多态性,24,5.2.3 StringBuffer类,StringBuffer类也是java.lang.Object的子类。与String类不同,StringBuff
20、er类是一个在操作中可以更改其内容的字符串类。也就是说对于StringBuffer类的对象不仅能进行查找和比较等操作,也可以做添加、插入、修改之类的操作。,继承性和多态性,25,1.StringBuffer类的构造函数,1.StringBuffer类的构造函数(1)public StringBuffer()创建一个空字符串缓冲区,默认初始长度为16个字符。(2)public StringBuffer(int length)用length指定的初始长度创建一个空字符串缓冲区(3)public StringBuffer(String str)用指定的字符串str创建一个字符串缓冲区,其长度为str
21、的长度再加16个字符。,2.StringBuffer类中追加和插入新内容(1)append(10个重载方法)(2)insert(9个重载方法)返回类型均为StringBuffer。3.java.lang.StringBuffer常用成员方法参见表5.4。,继承性和多态性,26,3.StringBuffer类的常用成员方法,【例5.11】将给定不同数据类型的内容添加到当前字符串后面。【例5.12】测试字符串缓冲区的长度和容量。public class length_capacitypublic static void main(String args)StringBuffer buf1=new
22、StringBuffer();StringBuffer buf2=new StringBuffer(10);StringBuffer buf3=new StringBuffer(hello123);int len1=buf1.length();int len2=buf2.length();int len3=buf3.length();int le1=buf1.capacity();int le2=buf2.capacity();int le3=buf3.capacity();char ch=buf3.charAt(1);System.out.println(buf1=+buf1.toStrin
23、g();System.out.println(buf2=+buf2.toString();System.out.println(buf3=+buf3.toString();System.out.println(len1=+len1+tlen2=+len2+tlen3=+len3);System.out.println(le1=+le1+tle2=+le2+tle3=+le3);System.out.println(ch=+ch);,继承性和多态性,27,5.2.4 StringTokenizer类,在Java类库的java.util包中包含一个用于进行字符串词法分析的类StringTokeni
24、zer,将对字符串进行分解的方法进行封装,简化工作量。1StringTokenizer类的构造方法(1)public StringTokenizer(String str)(2)public StringTokenizer(String str,String delim)(3)public StringTokenizer(String str,String delim,boolean returnTokens)2StringTokenizer类的常用成员方法(1)public int countTokens()返回字符串中的当前单词的数量,为整数。(2)public boolean hasMo
25、reTokens()若还有子串,则返回true,否则返回false。(3)public String nextToken()返回下一个子串。(4)public String nextToken(String delim)重置delim中的分隔符后,返回串中下一个子串。,继承性和多态性,28,StringTokenizer类,3.程序设计举例【例5.13】测试StringTokenizer类。import java.util.*;public class testStringTokenizerpublic static void main(String args)String s=I like
26、Java programming!;StringTokenizer tokenizer=new StringTokenizer(s);System.out.println(总的单词个数为:+tokenizer.countTokens();while(tokenizer.hasMoreTokens()System.out.println(tokenizer.nextToken();System.out.println(还剩+tokenizer.countTokens()+个单词);,继承性和多态性,29,5.3 向量,数组的缺点:只能保存固定数目的元素,且必须把所有需要的内存单元一次性的申请出来
27、。如果实现不知道数组的长度,就需要估计。解决方法:vectorVector也是一组对象的集合,但可以根据需要动态伸缩,可以追加对象元素数量,可以方便的修改和维护序列中的对象。需要注意的是Vector类中对象不能是简单数据类型。,继承性和多态性,30,向量,向量比较适合在如下情况下使用:(1)需要处理的对象数目不定,序列中的元素都是对象或可以表示为对象。(2)需要将不同类的对象组合成一个数据序列。(3)需要做频繁的对象序列中元素的插入和删除。(4)经常需要定位序列中的对象和其他查找操作。(5)在不同的类之间传递大量的数据。,继承性和多态性,31,向量,1.Vector类的构造方法(1)Vecto
28、r()构造一个空的向量(2)Vector(int capacity)以指定的存储容量构造一个空的向量(3)Vector(int capacity,int capacityIncrement)以指定的存储容量和容量增量构造一个空的Vector。如:Vector MyVector=new Vector(100,50);2.Vector类的常用成员方法常用成员方法参见表5.5,继承性和多态性,32,向量,【例5.14】测试Vector类。先创建Vector对象,再删除掉其中的所有字符串对象“to”。,import java.util.*;public class testStringTokenize
29、r2 public static void main(String args)Vector MyVector=new Vector(100);for(int i=0;i3;i+)/向向量序列中追加元素 MyVector.addElement(welcome);MyVector.addElement(to);MyVector.addElement(beijing);for(int i=0;iMyVector.size();i+)/显示输出向量序列中的所有元素 String s=(String)MyVector.elementAt(i);/必须进行强制类型转换 System.out.print(s+);System.out.println();while(MyVector.removeElement(to);/删除向量序列中的所有to for(int i=0;iMyVector.size();i+)String s=(String)MyVector.elementAt(i);System.out.println(s);,继承性和多态性,33,作业,任选一:编写程序,读入10个整数,并按相反的顺序显示出来。有能力的话,排序后显示出来。(具体参见习题5-5)声明并创建一个4乘4的数组,并找出其中绝对值最大的元素的位置。,