Java数组2015年1月2目录java数组的基本概念一维数组多维数组数组的基本操作实训部分3数组的基本概念什么地方用数组?数组有什么好处?什么是数组?41java数组的基本概念数组应用场景:由键盘输入10个数字,并输出其最小值(了解使用数组的优点)数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素51java数组的基本概念数组(array):一组同类型有序数据的集合;数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素012345678979879482679887817491长度为N的数组,其下标是0~N-1int[]value;Value[0]数组名下标6一维数组如何声明一个数组,与声明基本数据类型有何区别?如何为数组分配存储空间?如何给数组赋值?如何遍历一维数组?72一维数组2.1数组的声明声明一个一维数组的一般形式为:类型数组名[];如:StringarrayName1[];intarrayName2[];类型[]数组名;如:String[]arrayName1;int[]arrayName2;注:类型可以是Java中任意的基本数据类型或引用类型;数组名是一个合法的标识符;[]指明该变量是一个数组变量。•数组类型也是一种类型,本身是一种引用类型,例如int是一个基本数据类型,但是int[]就是一种引用数据类型。•推荐使用第二种声明方式,因为第二种声明方式具有更好的可读性,对于int[]arrayName方式,很容易可以理解成:定义一个变量arrayName,类型为int[]。82一维数组2.2数组的初始化Java在数组声明时并不为数组分配存储空间,仅有数组声明,而未分配存储空间。Java语言中数组必须先初始化,然后才可以使用。初始化包括数组的内存分配和对数组元素赋初始值。Java数组的初始化分为两种方式:静态初始化:数组定义与数组元素的空间分配和赋值操作同时进行。动态初始化:数组定义与数组元素的空间分配和赋值操作分开进行。92一维数组2.2.1数组的静态初始化数组初始化是指在声明数组的同时指定数组元素的初始值。语法格式如下:arrayName=newtype[]{element1,element2,…};例如:为数组分配存储空间静态初始化还有一种简化的数据形式(比上面的方式用的更广泛):102一维数组如下几种数组初始化方式是不允许的数组的长度由程序自动计算,不需要我们手动写。2.2.1数组的静态初始化112一维数组2.2.2数组的动态初始化new运算符可为数组分配存储空间。为已声明数组(类型数组名[])分配空间的一般形式如下:arrayName=newtype[arrayLength];注:数组大小也称为数组的长度,可以为整型常量或变量如:(1)int[]value;value=newint[10];(2)int[]value=newint[10];//声明数组的同时,用new运算符为数组分配空间//int[10]value=newint[10];//错误为数组分配存储空间122一维数组语法:数组[下标]下标是从0开始的int[]a=newint[4];a[0]=20;//访问数组元素并赋值a[1]=a[0]+10;2.2.3一维数组的访问访问其他元素会产生数组越界错误,会出现异常:ArrayIndexOutOfBoundsException,如访问a[4]20a[0]30a[1]0a[2]0a[3]132一维数组2.2.4初始化的内存分配为数组分配空间有两种方法:数组初始化和使用new运算符;为数组分配空间后,数组变量指向数组存储空间的引用地址。####栈(Stack)堆(Heap)i142一维数组为数组分配空间有两种方法:数组初始化和使用new运算符;为数组分配空间后,数组变量指向数组存储空间的引用地址。########i栈(Stack)堆(Heap)a2.2.4初始化的内存分配15****####ia2一维数组为数组分配空间有两种方法:数组初始化和使用new运算符;为数组分配空间后,数组变量指向数组存储空间的引用地址。栈(Stack)堆(Heap)00002.2.4初始化的内存分配16****4ia2一维数组为数组分配空间有两种方法:数组初始化和使用new运算符;为数组分配空间后,数组变量指向数组存储空间的引用地址。栈(Stack)堆(Heap)01232.2.4初始化的内存分配172一维数组当数组创建后,数组名中就存储为数组存储区的首地址(即一种引用),可以将此地址赋值给另一同类的数组,即数组的引用,如:int[]value1={1,2,3};int[]value2;value2=value1;2.2.5数组间的赋值182一维数组2.2.5数组间的赋值********4ia栈(Stack)堆(Heap)0123b********4ia栈(Stack)堆(Heap)0123b0123这句话运行完成后,内存变成右边的哪个图?192一维数组2.3一维数组的遍历正向遍历:反向遍历:202一维数组2.3一维数组的遍历例题1:定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。212.3一维数组的遍历2一维数组222一维数组2.3一维数组的遍历由于求数组最大值,最小值,平均值,和值比较常用,因此我们可以将其包装起来。232一维数组2.3一维数组的遍历获取数组最小值获取数组最大值获取数组总和值获取数组平均值24多维数组多维数组与一维数组有什么区别?如何访问多维数组的元素?如何遍历多维维数组?253多维数组创建多维数组int[][]value1=newint[2][3];int[][][]value2=newint[2][3][4];int[][]intArray={{1,2},{3,4},{5,6}};//二维数组的初始化多维数组被看作数组的数组。例如二维数组为一个特殊的一维数组,其每个元素又是一个一维数组。下面的讨论主要针对二维数组,更高维数的数组情况类似于二维数组。多维数组元素的访问a[0][0]b[1][2][3]3.1多维数组的创建、访问263多维数组注:系统将根据初始化时给出的初始值的个数自动计算出数组每一维的大小;在Java语言中,由于把二维数组看作是数组的数组,数组空间不一定连续分配,所以不要求二维数组每一维的大小相同。int[][]intArray={{1,2},{3,4,5},{6,7}};//二维数组的初始化3.2多维数组内存分配27多维数组的声明过程####栈(Stack)堆(Heap)aJava中多维数组的声明和初始化是从高维到低维的顺序进行的28多维数组的声明过程****栈(Stack)堆(Heap)aJava中多维数组的声明和初始化是从高维到低维的顺序进行的nullnullnull29多维数组的声明过程****栈(Stack)堆(Heap)aJava中多维数组的声明和初始化是从高维到低维的顺序进行的****nullnull0030多维数组的声明过程****栈(Stack)堆(Heap)aJava中多维数组的声明和初始化是从高维到低维的顺序进行的********null0000031多维数组的声明过程****栈(Stack)堆(Heap)aJava中多维数组的声明和初始化是从高维到低维的顺序进行的************000000032二维数组的声明与初始化正确的声明方式错误的声明方式下面两种二维数组声明方式意义相同333二维数组语法:数组[一维下标][二维下标]下标是从0开始的二维数组的访问访问其他元素会产生数组越界错误,会出现异常:ArrayIndexOutOfBoundsException****栈(Stack)堆(Heap)a************0a[0][0]0a[0][1]0a[2][0]0a[2][1]0a[1][0]0a[1][1]0a[1][2]343多维数组3.3二维数组的遍历35对象数组对象数组基本数据类型数组有什么区别?什么是对象数组?36对象数组创建Student类37对象数组创建Student的对象数组students38数组操作的工具类(java.util.Arrays)数组的查找数组的排序数组的复制395数组的基本操作排序voidsort(type[]a):该方法将会对a数组进行排序。voidsort(type[]a,intfromIndex,inttoIndex):该方法与之前方法相似,区别是该方法仅仅对fromIndex到toIndex范围内的元素进行排序。java.util.Arrays类中包含了一些static修饰方法可以直接操作数组,为操作数组提供了很多方便的方法:二分查找intbinarySearch(type[]a,typekey):使用二分法查询key元素值在a数组中的索引。如果a中不包含key,则返回负数。该方法调用时必须保证数组中的元素已经按照升序排列。intbinarySearch(type[]a,intfromIndex,inttoIndex,typekey):这个方法与前一个方法类似,但它只搜索a数组中fromIndex到toIndex索引的元素。405数组的基本操作填充voidfill(type[]a,typeval):该方法会将a数组所有元素都赋值为val。voidfill(type[]a,intfromIndex,inttoIndex,typeval):该方法与之前方法相似,区别是该方法仅仅将fromIndex到toIndex范围内的元素赋值为val。java.util.Arrays类中包含了一些static修饰方法可以直接操作数组,为操作数组提供了很多方便的方法:判断相等booleanequals(type[]a,type[]b):如果数组a与数组b的长度相等,而且数组a和数组b中的元素也一一相同,则该方法返回true。转换成字符串StringtoString(type[]a):该方法将一个数组转换成一个字符串。该方法按顺序把数组元素连缀在一起,元素之间用(,)和空格分隔开。415数组的基本操作拷贝(复制)type[]copyOf(type[]original,intnewLength):该方法会把original数组复制成一个新数组,其中length是新数组的长度。如果length小于original数组的长度,则新数组就是原数组前面length个元素;如果length大于original数组的长度,则新数组就是原数组所有的元素,后面补充0、false或者null。type[]copyOf(type[]original,intfrom,intto):该方法与之前方法相似,区别是该方法仅仅复制from到to索引之间的元素。java.util.Arrays类中包含了一些static修饰方法可以直接操作数组,为操作数组提供了很多方便的方法:425数组的基本操作5.1java.util.Arrays的基本方法举例435数组的基本操作5.2数组的复制int[]a={1,3,7,2};int[]b=a;b[0]=12;现在a[0]的值是多少?数组b只是对数组a的又一个引用,不算复制。********a栈(Stack)堆(Heap)1372b问题:如何复制数组a中的元素到数组b,并且改变b中的元素值时,a中的元素值不发生改变?445数组的基本操作5.2数组的复制clone()方法****a栈(Stack)堆(Heap)1561125(1)(2)(3)********a栈(Stack)堆(Heap)1561125b1561125********a栈(Stack)堆(Heap)1561125b1061125(1)(2)(3)一维数组的clone()455数组的基本操作5.2数组的复制原因:java中没有二维数组的概念,只有数组的数组。二维数组a中存储的实际上是两