第4章数组字符串和向量

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第4章数组、字符串和向量数组、字符串和向量2主要内容4.1数组4.2字符串4.3向量数组、字符串和向量34.1数组数组是有序数据的集合,是由数目固定、相同类型的元素组成的,用一个统一的数组名和下标来唯一地确定数组中的元素。Java将数组作为对象来处理,数组是一种引用类型,从java.lang.Object继承而来,故Object类中的所有方法均可用。数组、字符串和向量44.1.1一维数组具有一个下标的数组称为一维数组。1.一维数组的声明其声明格式如下:这里只有数组变量的定义,没有为数组元素分配空间,只为数组的引用分配了空间,array1和array2目前为空的引用。方式一:数据类型数组名[];方式二:数据类型[]数组名;例如:intarray1[];double[]array2;数组、字符串和向量54.1.1一维数组注意:(1)格式二中,在数组标志[]后出现的所有变量都将是数组变量。Java中,经常采用第二种格式声明数组。(2)在数组的声明中不指定数组的长度。数组、字符串和向量62.一维数组的初始化一维数组定义之后,必须经过初始化才可以引用,数组经过初始化后,其长度(即可存放的元素个数)就不可再改变。数组的初始化分为静态初始化和动态初始化两种:数组、字符串和向量72.一维数组的初始化(1)静态初始化:在定义数组的同时对数组元素进行初始。int[]intArray={1,2,3,4};//定义了一个含有4个元素的int型数组注意:①在给数组赋初值时,不能同时指定数组的大小,Java会根据初值的多少自动计算数组的大小。②静态初始化必须使用上述一条语句完成③当创建数组后,如果没有初始化,系统会根据数组的不同数据类型,指定不同的缺省值。继承性和多态性82.一维数组的初始化(2)动态初始化:用运算符new为数组分配空间①对于简单类型的数组,其格式如下:数据类型数组名[]=new数据类型[arraySize];数据类型[]数组名=new数据类型[arraySize];其中arraySize表示数组长度,通常为整型常量,用以指明数组元素的个数。或先声明数组,再对数组进行初始化:数据类型[]数组名;数组名=new数据类型[arraySize];继承性和多态性9②对于复合(引用)类型(类、接口、数组)的数组,需要经过以下两步进行内存空间的分配。首先:为数组分配空间,每一个数组元素都是一个引用,格式为:数组名[]=new数据类型[arraySize];然后为每一个数组元素分配所引用的对象空间,格式为:数组名[i]=new数组元素对象的构造函数;例如:StringstringArray[];//定义一个String类型的数组stringArray=newString[3];上述语句给数组stringArray分配3个引用空间,初始化每个引用值为nullstringArray[0]=newString(how);stringArray[1]=newString(are);stringArray[2]=newString(“you”);(如图示)数组、字符串和向量10数组stringArray的空间分配数组、字符串和向量113.一维数组元素的的引用当数组初始化后就可通过数组名与下标来引用数组中的每一个元素。一维数组元素的引用格式如下:数组名[int类型的表达式]注意:(1)与C/C++不同的是,Java对数组元素的下标要进行越界检查,以保证访问的安全性。若数组下标越界,Java会抛出java.lang.ArrayIndexOutOfBoundsException异常。(2)length是属于数组对象的数据域而不是方法。因此,使用length()会出错,length只有在数组创建后才能访问。创建前,数组的引用是null。(3)与C、C++中不同,Java对数组元素要进行越界检查以保证安全性。继承性和多态性124.数组的复制一个简单的赋值语句并不能完成数组复制工作,在Java中,可以使用赋值语句复制基本类型的变量却不能复制对象,如数组。将一个对象赋值给另一个对象,只会使两个对象指向相同的内存地址。赋值数组有以下三种方法:(1)用循环语句复制数组的每一个元素,如for(inti=0;isourceArray.length;i++)targetArray[i]=sourceArray[i];(2)使用Object的clone方法,如:int[]targetArray=(int[])sourceArray.clone();(3)使用System类中的静态方法arraycopy,arraycopy的语法如下:arraycopy(sourceArray,srcpos,targetArray,tarpos,length);【例4.1】编程实现两个数组间相互赋值。数组、字符串和向量134.数组的复制数组的复制有以下三种方法:(1)用循环语句分别复制数组的每一个元素,如:for(inti=0;isourceArray.length;i++)targetArray[i]=sourceArray[i];(2)使用Object类中的clone方法,如:int[]targetArray=(int[])sourceArray.clone();(3)使用System类中的静态方法arraycopy,arraycopy的语法如下:arraycopy(sourceArray,srcpos,targetArray,tarpos,length);其中,参数srcpos和tarpos分别指源数组和目标数组的起始位置,复制的元素个数由参数length指定。数组、字符串和向量145.增强的foreach循环JDK5.0增加了一种功能很强的循环结构,可以用来依次处理数组中的每个元素(其他类型的元素集合亦可),而不必为指定下标值而分心。这种增强的foreach循环的语句格式为:for(数据类型变量:集合){语句}数组、字符串和向量155.增强的foreach循环例如:下面的程序代码段打印输出数组array的所有元素值int[]array={1,3,5,7,9};for(intelement:array)System.out.println(element);这个循环应该读作:循环array中的每一个元素(foreachelementinarray)。该程序代码段等价于:for(inti=0;iarray.length;i++)System.out.println(array[i]);//intelement但是使用“foreach”循环语句显得更加简洁、更不易出错【例4.2】用数组求解Fibonacci数列的前20项,即使用数组下标表达式求解数学上的迭代问题。【例4.3】用冒泡法和选择法分别对N个数排序(升序)排序是把一组数据按照值的递增或递减的次序重新排列的过程,它是数据处理中常用的运算。利用数组的顺序存储特点,可方便地实现排序。排序算法有多种,这里只讨论较易理解的冒泡法排序和选择法排序两种,且要求排序结果为升序。【例4.4】对象数组使用举例。数组、字符串和向量166.程序举例数组、字符串和向量174.1.2二维数组如果数组的元素类型也是数组,这种结构就是多维数组。多维数组的维数没有限制,可以为二维、三维等。最常用的二维数组是一个特殊的一维数组,它的每个元素都是一个一维数组,又叫做数组的数组。表示矩阵或表格需要使用二维数组。1.二维数组的声明数据类型数组名[][];或数据类型[][]数组名;例如:intarr[][];或int[][]arr;数组、字符串和向量182.二维数组的创建与初始化二维数组的初始化也分为静态初始化和动态初始化两种。(1)静态初始化:在定义数组的同时为数组分配空间,例如:int[][]intArray={{1,2},{2,3},{3,4}};静态初始化时不必指出数组每一维的大小,系统会根据初始化时给出的初始值的个数自动算出数组每一维的大小。用指定初值的方式对数组初始化时,各子数组元素的个数可以不同。例如:int[][]arr1={{3,-9},{8,0,1},{10,11,9,8}};数组、字符串和向量192.二维数组的创建与初始化(2)动态初始化:对高维数组来说,动态分配内存空间有下面两种方法:①直接为每一维分配空间,格式如下:(举例说明)数据类型[][]数组名=new数据类型[数组长度][];或数据类型数组名[][]=new数据类型[数组长度][数组长度];数组、字符串和向量20例如:int[][]intArray1=newint[4][];int[][]intArray2=newint[4][3];/*定义了一个二维数组intArray2,分配了12个存储单元,类似一个4行3列的矩阵。*/需要注意的是不指定行数而指定列数是错误的。例如,下面的初始化是错误的。int[][]arr=newint[][4];//错误数组、字符串和向量21②从最高维开始(而且必须从最高维开始),分别为每一维分配空间。在这种情况下,第2维的每一个数组的长度可以不同,是一个不规则的二维数组。不规则的数组可以节省存储空间。例如:Strings[][]=newString[2][];s[0]=newString[2];s[1]=newString[3];s[0][0]=newString(Good);s[0][1]=newString(Luck);s[1][0]=newString(to);s[1][1]=newString(you);s[1][2]=newString(!);数组、字符串和向量223.二维数组的引用对二维数组中的每个元素,引用方式为:数组名[index1][index2]其中index1和index2是数组下标,为整型常数和整型表达式,都是从0开始的。二维数组也有length属性,可以求每一维数组的长度。对于:int[][]x=newint[3][4];数组、字符串和向量23【例4.5】测定数组的长度及数组赋值。publicclassTwoDimensionArray{publicstaticvoidmain(Stringarg[]){int[][]matrix={{1,2,3,4,5},{2,3,4,5},{3,4,5},{4,5},{5}};System.out.println(thelengthofmatrixis+matrix.length);for(inti=0;i5;i++)System.out.println(thelengthofmatrix[+i+]is+matrix[i].length);for(inti=0;imatrix.length;i++){for(intj=0;jmatrix[i].length;j++)System.out.print(matrix[i][j]+\t);System.out.println();}}}数组、字符串和向量24【例4.5】测定数组的长度及数组赋值。数组、字符串和向量25【例4.6】求二维数组中的最大数。【例4.7】实现矩阵的加法和乘法运算,要求矩阵的各元素值随机产生。数组、字符串和向量264.2字符串字符串是多个字符的序列,是编程中常用的数据类型。在纯面向对象的Java语言中,将字符串数据类型封装为字符串类,无论是字符串常量还是字符串变量,都是用类的对象来实现的,在对象中封装了一系列方法来进行字符串处理。数组、字符串和向量274.2.1String类一个字符串常量使用双引号括住的一串字符,字符常量是用单引号括住的一个字符。一个字符串常量是一个String对象,故可以使用String类中的各种方法。注意:若Java程序中多处出现字符串常量如ABC,则Java编译程序只创建一个String对象,所有的字符串常量ABC将使

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功