4.1 数组的定义及使用
数组是一组相关数据的集合,这些数据类型是完全相同的。数组按使用可以分为一维数组、二维数组和多维数组
4.1.1 一维数组
要使用数组,首先进行声明数组和分配内存两个步骤。
语法结构:
数据类型 数组名[] =null; //声明一维数组 或者 数据类型[] 数组名=null; 或者 声明的同时分配内存
数组名=new 数据类型[长度]; //分配内存给数组 数据类型 数组名[] =new 数据类型[个数]
数组名命名规则和变量相同,建议使用有意义的名称命名。
数组声明后实际上是在栈内存中保存了此数组的名称(实际上是保存对一堆内存的引用地址),接下来便是在堆内存中配置数组所需要的内存。“长度”是告诉编译器数组要存放多少个元素,new是命令编译器根据括号内的长度在堆内存中开辟一块堆内存供该数组使用。
null:引用数据类型的默认值是null,表示暂时还没有任何指向的堆内存空间。JDK1.5之后可以不用给数据默认值,但为了方便,建议一定给出默认值
由上图,一个数组开辟了堆内存之后,将在堆内存中保存数据,并将堆内存的操作地址给数组名称score。因为数组是引用数据类型,所以数组变量score保存的不是数组实体,而是堆内存的参考地址
堆栈内存:
数组操作中,栈内存中保存的永远是数组的名称。只开辟了栈内存空间的数组永远无法使用,必须有指向的堆内存才可以使用,要想开辟新的堆内存则必须使用关键字new,然后只是将此堆内存的使用权交给了对应的栈内存空间。而且一个堆内存空间可以同时被多个栈内存空间所指向,即一个人可以有多个名字,一个具体的人就相当于堆内存,名字就相当于栈内存
4.1.2 数组中元素的表示方法
score[10]表示长度为10,数组索引编号由0开始,score[0]——score[9]
package com; public class ArrayDemo01 { public static void main(String[] args) { int score[]=null; //声明数组,但未开辟堆内存空间 score=new int[3]; //为数组开辟堆内存空间 for (int i = 0; i < 3; i++) { //使用循环依次输出数组中的全部内容 System.out.println("score["+i+"]="+score[i]); //整型默认值为0 } System.out.println(score[3]); //超出数组下标报错 } }score[0]=0 score[1]=0 score[2]=0 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at com.ArrayDemo01.main(ArrayDemo01.java:10) Process finished with exit code 1
数组长度的获得:
数组名称.length——>返回一个int型数据
4.1.3 数组的静态初始化
数组的内容分为动态初始化和静态初始化两种。动态初始化:先声明后赋值 静态初始化:声明时赋值
静态初始化格式:
数据类型 数组名[] ={初值0,初值1,····,初值n}
编译器根据所给出的初值个数来判断数组的长度,分别依序指定给各元素存放
package com; public class ArrayDemo04 { public static void main(String[] args) { int score[]={91,92,93,94,95,96}; //使用静态初始化声明数组 for(int x=0;x<score.length;x++){ //循环输出 System.out.println("score["+x+"]="+score[x]); } } }score[0]=91 score[1]=92 score[2]=93 score[3]=94 score[4]=95 score[5]=96 Process finished with exit code 0
4.1.4 数组应用范例
package com; public class ArrayDemo07 { public static void main(String[] args) { int score[]={1,6,7,4,5,2,3}; bubbleSort(score); for (int i=0;i<score.length;i++){ System.out.print(score[i]+"\t"); } } public static void bubbleSort(int arr[]) { //N个数字冒泡排序,总共要进行N-1趟比较,每趟的排序次数为(N-i)次比较 for(int i =0 ; i<arr.length-1 ; i++) { //外循环为排序趟数,len个数进行len-1趟 for (j=0; j<len-1-i; j++) { //内循环为每趟比较的次数,第i趟比较len-1-i次 if (arr[j] > arr[j+1]) { //相邻元素比较,如果arr[j]比arr[j+1]的值大,那就交换位置若逆序则交换(升序为左大于右,降序反之) for(int j=0 ; j<arr.length-1-i ; j++) { if(arr[j]>arr[j+1]) { int temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } }1 2 3 4 5 6 7 Process finished with exit code 0
4.1.5 二维数组
如果说一维数组类似线性图形,二维数组相当于表格
声明格式:
数据类型 数据名[][] ; 或 数据类型 数组名[][] =new 数据类型[行的个数][列的个数];
数组名=new 数据类型[行的个数][列的个数] ;
与一维数组不同的是,二维数组在分配内存时,必须告诉编译器二维数组行与列的个数。
一维数组输出需要一层循环,二维数组输出需要两层循环,N维数组输出需要N层循环
静态初始化格式:
数据类型 数组名[][] ={
{第0行初值},{第1行初值},{第2行初值},·····,{第n行初值},
};
不需要定义数组的长度,[][]不需要填入内容
每组大括号内的初值会依序指定给数组的第0、1、2行元素,括号里的元素会依序指定给数组的第0、1、2个元素
package com; public class ArrayDemo09 { public static void main(String[] args) { int score[][]={{1,2},{3,4,5},{6,7,8,9}}; for(int i=0;i< score.length;i++){ //外层循环输出行 for (int j=0;j<score[i].length;j++){ //内层循环输出列 System.out.print(score[i][j]+"\t"); //输出每一个元素 } System.out.println(); //换行 } } }1 2 3 4 5 6 7 8 9 Process finished with exit code 0
4.1.6 多维数组
想要提高数组维数,只要在声明数组时将索引与中括号再加一组即可,所以三维数组的声明是int score[][][],四维int score[][][][],相应输出时的嵌套更多一层




945

被折叠的 条评论
为什么被折叠?



