02-java语言基础-数组向量字符串.ppt

上传人:本田雅阁 文档编号:2124866 上传时间:2019-02-19 格式:PPT 页数:103 大小:844.01KB
返回 下载 相关 举报
02-java语言基础-数组向量字符串.ppt_第1页
第1页 / 共103页
02-java语言基础-数组向量字符串.ppt_第2页
第2页 / 共103页
02-java语言基础-数组向量字符串.ppt_第3页
第3页 / 共103页
亲,该文档总共103页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《02-java语言基础-数组向量字符串.ppt》由会员分享,可在线阅读,更多相关《02-java语言基础-数组向量字符串.ppt(103页珍藏版)》请在三一文库上搜索。

1、第二章 Java 语言基础,NCEPU,Contents,1.数组,复合数据类型,NCEPU,复合数据类型,早期的程序设计语言把变量看作是孤立的东西,例如我们往往用三个整数变量day,month和year来表示日期 int day, month, year; 虽然这种方法容易理解,但是有两个明显的缺点:,NCEPU,复合数据类型,程序若要处理多个日期,则需要更多的说明,例如要保存两个生日,则需要: birthday1, birthmonth1, birthyear1 birthday2, birthmonth2, birthyear2 该程序因使用了多个变量而变得混乱,并且占用了过多的命名空间

2、。 每个变量都是独立的,而其实它们应当是某一个日期的组成部分,这样定义无法体现整体的联系。,NCEPU,复合数据类型,复合数据类型由程序员在源程序中定义,把描述整个对象各个不同方面的变量放到一个定义中,建立该模型。一旦有了定义,就可以使用该类型名来创建变量。 Java是面向对象的程序设计语言,它为用户提供的复合数据类型即类 和 接口。,NCEPU,复合数据类型,引用类型(reference type即复合类型),引用型变量的值与基本类型(简单类型)变量不同,变量值是指向内存空间的引用(地址)。所指向的内存中保存着变量所表示的一个值或一组值。,引用在其他语言中称为指针或内存地址。Java不支持显

3、式使用内存地址,而必须通过变量名对某个内存空间地址进行访问。,NCEPU,两种类型变量的不同处理,int a; a=12;,MyDate today; today.day=14;,引用型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问.,MyDate today; today=new MyDate (); today.day=14;,NCEPU,关于对象和对象的“引用”,String s=new String(“a String”); An object of String is created The object is initialized w/”a String”

4、 A variable as handle to String is created The value of the handle variable is assign to the object,String s;,s,a String,数组和字符串,NCEPU,第一节 数组,数组概述 一维数组 二维数组,NCEPU,数组概述,数组,是由数目固定的、相同类型的元素组成的有序集合,每个元素相当于一个变量。 在Java中,数组是最简单的复合数据类型,NCEPU,数组概述,数组元素可以是任意类型,可以是简单类型,也可以是引用类型。 访问数组中的某个元素,可以通过数组名加下标的形式,例如:a4。

5、数组下标的个数就是数组的维数: 有一个下标就是一维数组,有两个下标就是二维数组,依次类推。,NCEPU,一维数组,一个一维数组实际上是一列相同类型的变量 一维数组的声明 一维数组的创建 一维数组初始化 数组边界,NCEPU,一维数组的声明,声明一维数组的格式是: ; 或 ;,例如:int a 或:Date d ,例如:int a 或:Date d,int a 5 是不正确的,要声明成:int a 或:int a,此时的数组a中的元素个数没有确定,系统没有创建具体的数组对象,而是声明了一个指向数组的引用,NCEPU,所有的引用类型都需要用new来初始化,一维数组的创建,创建一维数组的格式为: =

6、 new ; Java中没有静态定义的数组,数组的内存都是通过new动态分配的。,例如: a = new int 5;,此时系统创建了具体的数组对象,为每个数组元素分配了具体的内存单元,并进行了默认的初始化,a = new int 5;,NCEPU,一维数组的创建,数组的声明和创建可以同时进行: = new ; 或 = new ;,例如: int a = new int 5; 或:int a = new int 5;,NCEPU,public class Test public static void main(String args) int s; s=new int 5; for (int

7、 i=0;i5;i+) si=2*i+1 ,一维数组,NCEPU,一维数组,public class Test public static void main(String args) int s; s=new int 5; for (int i=0;i5;i+) si=2*i+1 ,NCEPU,一维数组,public class Test public static void main(String args) int s; s=new int 5; for (int i=0;i5;i+) si=2*i+1 ,NCEPU,一维数组,public class Test public stati

8、c void main(String args) int s; s=new int 5; for (int i=0;i5;i+) si=2*i+1 ,NCEPU,一维数组的创建,一旦为数组分配了存储空间,程序中就不能改变数组的长度,但是可以再次使用new生成新的数组对象,分配新的存储空间。 例如: int a = new int5; a = new int 6;,数组创建后就不能改变其大小,但是可以使用相同的引用变量指 向一个全新的数组。本例中,第一个数组实际上丢失了,除非还 有其他引用指向它,NCEPU,注意:元素为引用类型的数组中的每一个元素都需要实例化。,设已定义了Date类 包括三个成

9、员变量:year, month, day,一维数组的创建,当创建的数组元素是一个类的对象的时候,这些对象必须要单独创建。,Date d ; /Date是一个类,d = new Date 5; /初始化,用new为数组分配空间,d 1 = new Date( );,NCEPU,一维数组的初始化,当创建一个数组对象时,每个数组元素都会被自动初始化。,int a = new int 5;,char c = new char 5;,Date d = new Date 5;,NCEPU,一维数组的初始化,可以在声明数组的同时,为数组元素赋初值。,int a = 1, 2, 3, 4, 5;,静态初始化,

10、相当于: int a = new int 5; a 0 = 1; a 1 = 2; a 2 = 3; a 3 = 4; a 4 = 5;,注意: 静态初始化必须在声明数组时进行,而不能写 成如下形式: int a ; a =1,2,3,4,5 或 int a = new int 5; a=1,2,3,4,5,NCEPU,一维数组的初始化,可以在声明数组的同时,为数组元素赋初值。,Date days=new Date(17,3,2010), new Date(17,3,2010), new Date(17,3,2010) ;,静态初始化,NCEPU,当用new创建了一个对象时,系统为对象中的变量

11、进行了初始化,即不但为变量分配了相应的存储单元,还设置了变量所属类型的相应初值,这样就避免发生变异错误。,复合数据类型(引用类型):声明时并未创建具体对象,而是声明了一个指向复合数据类型的引用,引用类型都需要用new来初始化,一维数组的初始化,NCEPU,一维数组的初始化,public class Test public static void main (String args) int a =new int5; Date days=new Date3; System.out.println(a3); System.out.println(days2); class Date int yea

12、r, month, day; Date (int y, int m, int d) year=y; month=m; day=d; ,0 null,NCEPU,一维数组,NCEPU,一维数组,NCEPU,一维数组,NCEPU,数组边界,数组类中有唯一的一个成员变量:length,用来表示数组的长度,即数组元素的个数。 在Java中,数组的下标从0开始,到length-1结束,即数组a的第一个元素是a0,最后一个元素是alength-1。 另外,与C、C+中不同,Java对数组元素要进行越界检查以保证安全性。,NCEPU,数组边界,使用new创建数组对象时,自动给length赋值,数组一旦创建完

13、毕,length就确定下来,除非重新使用new创建新的数组对象。 程序在运行过程中会对length进行检查,若发生越界访问,则会抛出一个异常。,NCEPU,数组边界,例 求一组数中的最大值和最小值。 在本例中,使用一维数组来存放Math.random( )方法产生的一组099之间的随机数。 Math.random( )方法: public static double random( ),想得到一个099之间的数,可以使用: int num = (int) (100* Math.random( ) );,NCEPU,class ArrayMax public static void main (

14、String args ) final int SIZE = 10; int num = new int SIZE; int i, max, min; System.out.print (“ nums: “); for ( i = 0; i num.length; i+ ) num i =(int)(100*Math.random( ); System.out.print (“ “+num i ); System.out.println( );,可能的输出为: nums:15 68 19 78 22 85 32 59 75 91,NCEPU,class ArrayMax public stat

15、ic void main (String args ) max = num 0 ; min = num 0 ; for ( i = 1; i max) max = num i ; if (num i min) min = num i ; System.out.println(“Max is: “+max ); System.out.println(“Min is: “+min ); ,输出为: Max is: 91 Min is: 15,之前的输出为: nums : 15 68 19 78 22 85 32 59 75 91,NCEPU,二维数组,Java中并没有真正的多维数组,而是通过建立数

16、组的数组来得到多维数组,即数组的元素还是数组。 最常用的是二维数组,例如: int mat = new int 2 3;,NCEPU,二维数组,int mat = new int 2 3;,int mat ;,mat = new int 2 ;,mat 0 = new int 3 ;,mat 1 = new int 3 ;,NCEPU,二维数组,创建二维数组的一般格式为: type arrayN = new type arrleng1 arrayN0 = new type arrleng2; arrayN1 = new type arrleng2; arrayNarrayleng1-1 = n

17、ew type arrleng2;,第二维大小一致的二维数组叫作矩阵数组,NCEPU,二维数组,也可以定义非矩阵数组。,int mat = new int 3 ;,mat 0 = new int 5 ;,mat 1 = new int 3 ;,mat 2 = new int 2 ;,NCEPU,二维数组,可以在创建二维数组时进行初始化。,int mat1 = 1,2,3 , 4,5,6 ,int mat2 = 1,2 , 3,4,5,6 ,mat1: 1 2 3 4 5 6,mat2: 1 2 3 4 5 6,NCEPU,二维数组,书写二维数组是要注意合法化:,int a = new int

18、2 3 ;,int b 2 3 ;,int c = new int 2 3 ;,int d = new int 2 ;,int e = new int 3 ;,NCEPU,第二节 字符串,声明字符串变量 字符串运算 String类的常用方法,NCEPU,字符串概述,字符串是内存中连续排列的一个或多个字符,在Java中,字符串是一个对象。 在Java中提供了String和StringBuffer类型,它们都是标准包java.lang中封装的类,分别用于处理不变字符串和可变字符串。,NCEPU,字符串概述,String类不变字符串类 是指字符串一旦建立,其内容就不能改变,若要改变字符串的内容,则将

19、生成新的实例 StringBuffer类可变字符串类 是指字符串中的内容是可以改变的,NCEPU,字符串概述,Java的字符串用关键字String标记。这里的 String不是一个简单类型,而是Java定义的一个类(class),属于引用类型。 在此,我们先将String当作一个数据类型使用。,NCEPU,1、声明字符串变量,格式: String 变量名; 存储方式: 字符串是引用类型,其存储方式与简单类型变量不同。,String str; String str=“abc”;,7,7,0x01234567,0x01234567,Hello,x,y,s,t,int x=7; int y=7; S

20、tring s=“Hello”; String t=s;,String s=“Hello”; String t=“World”; String r=s+t;,0x1234567,0x1234568,0x1234569,Hello,World,HelloWorld,s,t,r,NCEPU,String类 - 1字符串的创建,对于字符串变量,在使用之前要显式说明,并进行初始化: String s1 = new String ( “This is a String“ ); 或直接用字符串常量来初始化一个字符串: String s2 = “This is a String“;,NCEPU,String

21、类 - 1字符串的创建,String s1 = “Hello“;,String s2 = “Hello“;,s2 = “World“;,s2 = “Hello“;,String s3 = new String (“Hello“);,NCEPU,String类 - 1字符串的创建,String s = “Hello“;,String t = s;,s = “World“;,t = “World“;,NCEPU,小结,1) String s1=“abc”; 2) String s2=new String(“abc”); 区别: 第1种方法是定义了一个字符串常量,存放地点是常量池 第2种方法是创建了

22、一个字符串对象,是在执行期创建的,NCEPU,字符串运算,程序中可以用赋值运算为字符串变量赋值。,str=“abc”+”xyz”,除此之外,Java定义“+”可用于两个字符串 的连接运算。,如果字符串与其他类型变量进行“+”运算, 系统自动将其他类型转换为字符串。,NCEPU,例,用if语句,将三个整数按从小到大的顺序输出(三个整数已知,为34,21,27)。,NCEPU,class Order public static void main (String args ) int a=34, b=21, c=27, t; if (ab) t=a; a=b; b=t; if (bc) t=b;

23、b=c; c=t; if (ab) t=a; a=b; b=t; System.out.println(“The order is“+ a+“,“+b+“,“+c); ,The order is 21,27,34,NCEPU,class Order public static void main (String args ) int a=34, b=21, c=27, t; if (ab) t=a; a=b; b=t; if (bc) t=b; b=c; c=t; if (ab) t=a; a=b; b=t; System.out.println (a + b + c); ,The order

24、 is 82,NCEPU,class Order public static void main (String args ) int a=34, b=21, c=27, t; if (ab) t=a; a=b; b=t; if (bc) t=b; b=c; c=t; if (ab) t=a; a=b; b=t; System.out.println(“The order is“ + a + b + c); ,The order is 212734,NCEPU,String类 - 2String类的常用方法,Java为String类定义了许多方法,可以通过下述格式调用Java定义的方法: .;

25、,NCEPU,String类 - 2String类的常用方法,int length ( ) 返回字符串的长度 System.out.println (s1.length();,例如: String s1 = “Hello“;,5,char charAt ( int index ) 返回字符串中index位置的字符 System.out.println ( s1.charAt (1) );,e,NCEPU,String类 - 2String类的常用方法,String toLowerCase ( ) 将当前字符串中所有字符转换成小写形式 System.out.println(s1.toLowerC

26、ase ();,例如: String s1 = “Hello“;,hello,String toUpperCase ( ) 将当前字符串中所有字符转换成大写形式 System.out.println(s1.toUpperCase ();,HELLO,NCEPU,String类 - 2String类的常用方法,String substring (int beginIndex ) 返回从beginIndex开始的子串 System.out.println ( s1.substring ( 2 ) );,例如: String s1 = “Hello“;,llo,String substring (i

27、nt beginIndex, int endIndex) 返回从beginIndex开始到endIndex之前的子串 System.out.println ( s1.substring(2, 4) );,ll,NCEPU,String类 - 2String类的常用方法,String replace ( char oldChar, char newChar ) 将字符串中所有的oldChar转换为newChar System.out.println ( s1.replace ( l, t);,例如: String s1 = “Hello“;,Hetto,int indexOf(String st

28、r) 返回str在字符串中第一次出现的位置 System.out.println ( s1.indexOf ( “ell“) );,1,NCEPU,String类 - 2String类的常用方法,String concat (String str) 将str连接在当前字符串的尾部 System.out.println ( s1.concat(“ World!“);,例如: String s1 = “Hello“;,Hello World!,NCEPU,String类 - 2String类的常用方法,boolean equals (String str ) 比较str与当前字符的内容是否相同 S

29、ystem.out.println ( s1.equals ( “hello“ ) );,例如: String s1 = “Hello“;,false,boolean equalsIgnoreCase (String str ) 比较str与当前字符的内容是否相同,并且忽略字符大小写 System.out.println(s1.equalsIgnoreCase (“hello“);,true,NCEPU,0,若str和当前字符串仅长度不同,则返回两者长度的差值 System.out.println(pareTo(“Hello World“);,String类 - 2String类的常用方法,i

30、nt compareTo (String str ) 比较str和当前字符串的内容,返回差值,例如: String s1 = “Hello“;,若str和当前字符串相等,则返回0 System.out.println (pareTo (s1) );,6,若str和当前字符串不相等,则返回第一个不同字符的差值 System.out.println ( pareTo (“Hillo“);,4,NCEPU,String类 - 3= = 与 equals( )方法,equals ( ) 是判断两个String对象内容是否相同 = = 是判断两个String对象是否为同一实例,即在内存中的存储空间是否一

31、致。,NCEPU,class StringTest2 public 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 result21 = s1.equals(s2);,result21 = tru

32、e,Boolean result22 = s1= = s2;,result22 = true,Boolean result31 = s1.equals(s3);,result31 = true,Boolean result32 = s1= = s3;,result32 = false,result41 = true,Boolean result41 = s1.equals(s4);,result42 = false,Boolean result42 = s1= = s4;,result51 = true,Boolean result51 = s1.equals(s5);,result52 =

33、true,Boolean result52 = s1= = s5;,NCEPU,StringBuffer类,StringBuffer类处理可变字符串,当修改一个StringBuffer类的字符串对象时,不会再产生新的实例,而是直接操作原字符串。 系统为StringBuffer类对象分配内存时,除去字符所占空间外,再另加16个字符大小的缓冲区。,NCEPU,StringBuffer类 创建,StringBuffer s1 = new StringBuffer ( ); / 创建一个大小为16个字符的空StringBuffer对象 StringBuffer s2 = new StringBuffe

34、r(40) ; / 创建一个大小为40个字符的空StringBuffer对象 StringBuffer s3 = new StringBuffer(“Hello“); / 创建一个大小为21个字符的StringBuffer对象,NCEPU,StringBuffer类 - 常用的方法,int length ( ) 返回StringBuffer对象中字符的长度 System.out.println(s1.length();,例如: StringBuffer s1 = new StringBuffer(“Hello“),5,int capacity() 返回StringBuffer对象缓冲区的容量

35、System.out.println(s1.capacity();,21,NCEPU,StringBuffer类 - 常用的方法,void ensureCapacity(int size) 设置StringBuffer对象的缓冲区容量 s1.ensureCapacity(50); System.out.println(s1.capacity();,例如: StringBuffer s1 = new StringBuffer(“Hello“),50,NCEPU,StringBuffer类 - 常用的方法,void setLength(int len) 设置StringBuffer对象字符长度 s

36、1.setLength(2); System.out.println(s1);,例如: StringBuffer s1 = new StringBuffer(“Hello“),He,NCEPU,StringBuffer类 - 常用的方法,StringBuffer append (Object obj) 连接StringBuffer对象 System.out.println(s1.append(“ World“); System.out.println(s1);,例如: StringBuffer s1 = new StringBuffer(“Hello“),Hello World,Hello W

37、orld,NCEPU,向量(Vector)是java.util类包提供的一个工具类。它对应于类似数组的顺序存储的数据结构,但是具有比数组更强大的功能。它是允许不同类型元素共存的变长数组。每个Vector类的对象可以表达一个完整的数据序列。,第三节 向量,NCEPU,Vector类的对象不但可以保存顺序的一列数据,而且还提供了许多有用的方法来操作和处理这些数据。 Vector类对象所表达的序列中元素的个数是可变的,即Vector实现了变长数组。,Vector类,NCEPU,Java中的数组只能保存固定数目的元素,且必须把所有需要的内存单元一次性的申请出来,而不能先创建数组再追加数组元素数量。 为

38、了解决这个问题Java中引入了向量类Vector。Vector也是一组对象的集合,但相对于数组,Vector可以追加对象元素数量,可以方便的修改和维护序列中的对象。,Vector类,NCEPU,向量比较适合在如下情况下使用: 1. 需要处理的对象数目不定,序列中的元素都是对象或可以表示为对象 2. 需要将不同类的对象组合成一个数据序列 3. 需要做频繁的对象序列中元素的插入和删除,Vector类,NCEPU,向量比较适合在如下情况下使用: 4. 经常需要定位序列中的对象和其他查找操作 5. 在不同的类之间传递大量的数据 Vector类的方法相对于数组要多一些,但是使用这个类也有一定的局限性,例

39、如其中的对象不能是简单数据类型等。,Vector类,NCEPU,(1) 创建向量类的对象 Vector类有三个构造方法: Vector():构造一个空的向量。 Vector(int capacity):以指定的存储容量构造一个空的向量。 Vector(int capacity, int capacityIncrement):以指定的存储容量和容量增量构造一个空的Vector。,Vector类,Vector MyVector=new Vector(100,50);,在创建Vector序列时,不需要指明序列中元素的类型,可以在使用时确定。,这样创建的MyVector向量序列初始有100个元素的空间

40、,以后一旦使用殆尽则以50为单位递增,使序列中元素的个数变化成150,200,。,NCEPU,(2) 向向量序列中添加元素: addElement( Object obj) 将新元素添加到序列尾部。 add(Object obj) 将新元素添加到序列尾部。 insertElementAt(Object obj, int index) 将新元素插入到指定位置。,Vector类,NCEPU,Vector类,import java.util.*; class Test public static void main(String arg) Vector MyVector=new Vector();

41、for (int i=1;i=10;i+) MyVector.addElement(new Integer(i); MyVector.insertElementAt(“middle“,5); for (int i=0;i=10;i+) System.out.println(MyVector.elementAt(i); ,运行结果: 1 2 3 4 5 middle 6 7 8 9 10,NCEPU,(3) 修改或删除向量序列中的元素 1. setElementAt(Object obj,int index) 将向量序列index位置处的对象元素设置成为obj,如果这个位置原来有元素,则被覆盖。

42、 2. removeElement(Object obj) 删除向量序列中第一个与指定的obj对象相同的元素,同时将后面的元素前提,补上空位。这个方法返回的是布尔值。 3. removeElementAt(int index) 删除index指定位置处的元素,同时将后面的元素前提。,Vector类,Vector MyVector=new Vector(100); for (int i=0;i10;i+) MyVector.addElement(“welcome”); MyVector.addElement(“to”); MyVector.addElement(“beijing”); while

43、 (MyVector.removeElement(“to”);,NCEPU,4. removeAllElements() 清除向量序列中的所有元素。,Vector类,NCEPU,(4)查找向量序列中的元素 1.Object elementAt(int index) 返回指定位置处的元素。 一个要注意的问题:由于返回的是Object类型的对象,在使用之前通常需要进行强制类型转换,将返回的对象引用转换成Object类的某个具体子类的对象。例如: String str=(String)MyVector.elementAt(0); 2. boolean contains(Object obj) 检查向

44、量序列中是否包含指定的对象元素obj。,Vector类,NCEPU,3. int indexOf (Object obj,int start_index) 从指定的start_index位置开始向后搜索,返回所找到的第一个与指定对象obj相同的元素的下标位置。若指定的对象不存在,则返回1。 4. int lastIndexOf(Object obj,int start_index) 从指定的start_index位置开始向前搜索,返回所找到的第一个与指定对象obj相同的元素的下标位置。若指定的对象不存在,则返回1。,int i=0; While(i=MyVector.indexOf(“welc

45、ome”,i)!=-1) System.out.println(i); i+; ,Vector类,NCEPU,(5)Vector中的其他方法 capacity():返回Vector的容量 clone():建立Vector的备份 copyInto(Object):把Vector中的元素拷贝到一个数组中 firstElement():返回第一个元素 lastElement():返回最后一个元素 isEmpty():判断是否为空 setSize(int size):设置Vector的大小 size():返回Vector中元素的数量 trimToSize():将Vector的容量下调至最小值,Vect

46、or类,NCEPU,使用Vector时,一个需要特别注意的问题就是要先创建后使用。 如果不先使用new运算符利用构造方法创建Vector类的对象,而直接使用Vector的方法,如:add()等方法,则可能造成堆栈溢出或使用null指针等异常,妨碍程序的正常运行。,Vector类,NCEPU,例题:用向量实现,创建3个学生对象(学号、姓名、年龄)和4个教师对象(教工号、姓名、系别),并且输出。,Vector类,NCEPU,Vector类,import java.util.*; class Stu String xh; String xm; int nl; Stu(String xh1,Strin

47、g xm1,int nl1) xh=xh1;xm=xm1;nl=nl1; void disp() System.out.println(“学生:“+xh+“ “+xm+“ “+nl); ,NCEPU,Vector类,class Tech String zh; String xm; String xb; Tech(String zh1,String xm1,String xb1) zh=zh1;xm=xm1;xb=xb1; void disp() System.out.println(“教师:“+zh+“ “+xm+“ “+xb); ,NCEPU,Vector类,public class StuTer public static void main(String s) Vector st=new Vector(); st.add(new Stu(“101“,“李明“,18); st.add(new Stu(“102“,“王大力“,20

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1