一、数组的定义
1.基本用法
Type arrayName[ ]
与C中不同的是,java在数组定义时并不为元素分配内存,而对于如上定义的数组我们是不能访问它的任何元素的。所以,我们需要用到运算符new为它分配内存空间。格式为:类型[ ] 数组变量名=new 类型[长度];
如:int[ ] ia=new int[10];
值得注意的是,数组一旦定义,它的长度就会是固定的。另外,可通过“数组名.length”取得数组的长度;“数组名[下标值]”取得相应下标对应的取值。但数组的下标值是从0开始到数组长度-1,若超出此范围则越界报错。
2.定义的三种方式
//仅定义一个某类型的数组变量,并没有指明数组对象,这时ia的值为null
int[] ia;
//将数组变量指向一个数组对象,数组中每个位置的默认值为0
ia=new int[5];//默认初始化法
//创建数组时就给数组中的元素赋值
String[] s=new String[]{"Chinese","Math","English"};//静态初始化法
//上句代码相当于以下几行代码
String[] s1=new String[3];
s1[0]="Chinese";
s1[1]="Math";
s1[2]="English";//动态初始化法
二、两种常见易出现错误
1.数组越界
2.空指针异常
虽说这两种错误相关的知识都已了解,但还是值得引起注意!
三、多维数组
多维数组和一维数组的创建赋值都类似,可以这样理解:二维数组相当于就是一个数组里的每个元素又是一个数组,这样一来,多维数组就好理解多了。
练习:
了解了一下希尔排序,但是觉得希尔排序还不如冒泡,插入,选择排序简单,不过它也算是一种排序方法吧,下面来看看希尔排序:
//希尔排序
public static int[] shell(int[] x){
//分组,每次对半分
for(int increment =x.length/2;increment>0;increment/=2){
//并从半分处与后边每个数相比
for(int i=increment;i<x.length;i++){
int temp=x[i];
int j=0;
for(j=i;j>=increment;j-=increment){//该循环对每个j只运行一次
if(temp<x[j-increment]){
x[j]=x[j-increment];
System.out.println(i+" "+j+" "+(j-increment));
}else{
break;
}
}
x[j]=temp;
System.out.println(j);
}
}
return x;
}
导致我理解出错的地方在于第二个循环,没注意到此循环是从对半分处一直循环到数组最后一个元素。
另外,在练习中掌握了找出二维数组的最大值的方法:
//找出二维数组中的最大值
public static void Max(int[][] ib){
int Max=ib[0][0];//假设数组的第一个元素值为最大值
int value[]=new int[ib.length*ib[0].length];//考虑到可能存在多个最大值,用一个一维数组记录下来
//循环比较
for(int i=0;i<ib.length;i++){
for(int j=0;j<ib[i].length;j++){
if(ib[i][j]>Max){
Max=ib[i][j];
//由于新的最大值的出现,以前存有的所有最大值清空
for(int m=0;m<=i;m++){
for(int n=0;n<=j-1;n++){
value[m*ib[0].length+n]=0;
}
}
value[i*ib[0].length+j]=ib[i][j];//将目前最大值保存起来
}else if(ib[i][j]==Max){
value[i*ib[0].length+j]=ib[i][j];//把与暂存最大值相等的数存起来
}
}
}
for(int i=0;i<ib.length*ib[0].length;i++){
if(value[i]==Max){
ib[i/ib[0].length][i%ib[0].length]=value[i];//将一维数组保存的最大值还原成二维数组
System.out.println("二维数组最大值所在位置为"+i/ib[0].length+i%ib[0].length+"最大值为"+Max);
}
}
}
其间主要是要考虑到可能有多个最大值的同时存在,采用一维数组将可能的最大值暂存起来,当然还有另外更多更好的方法^_^