数组是编程语言中常见的一种引用数据结构,他用来存储一组相同数据类型的数据,也就是说,在一个数组中所有的数据的数据类型都是一致的。数组中提供了数组下标的概念,通过数组下标可以访问到数组中的各个数据。和许多其他的语言一样,在Java中也有一位数组,二维数组两个概念,让我们分别来看一下吧
一:一维数组
1:数组的定义
数据类型[] 数组名称; 或者 数据类型 数组名称[];
注意:
◆上面两条语句,仅仅是声明了一个数组,还没有指向任何的内存空间,所以这个时候不能访问这个数组。
◆相比较而言,建议使用第一种方式创建数组,具有更好的语意和可读性。如:int[] a; 我们知道这是声明了一个变量,变量名为a,类型为int[]数组,简单明了。
◆定义数组时不能指定数组的长度。如int[2] b;这种定义是错误的
2:数组的创建
数组名 = new 数据类型[数组长度];
注意:
◆数组在声明时并没有分配数组所指向的地址空间,然而在创建时,通过new就在内存中创建了数组长度个数据类型大小的空间类存放数据。
◆数组的下标从0开始到数组长度减1。比如:数组长度为n,则索引的范围为[0~n-1]
3:数组声明与定义的相互结合
数据类型[] 数组名称 = new 数据类型[数组长度];
4:数组的初始化
(1)静态初始化
数据类型[] 数组名 = {值1,值2,值3...};
◆千万不要再[]中指定数组的长度
◆注意这里没有new 关键字来创建数组
(2)动态初始化
所谓的动态初始化,就是指将数组的定义与数组的初始化分离开来。
数据类型[] 数组名 = new 数据类型[数组长度];
数组名[0] = 值1;。。。。。。 数组名[n-1] = 值n;
5:数组的输出
(1)格式化输出:
Arrays类为我们提供了数组的格式化输出方法:Arrays.toString(数组名);
(2)for循环输出:
for(数据类型 循环变量 = 初值;循环条件;变量的递增)
{ System.out.println(数组名称[i]); }
6:一维数组的具体应用
(1)数组的定义,创建,初始化,格式化输出
public class TestArray {
public static void main(String[] args) {
int[] niArr = new int[5];//数组定义创建的结合使用
System.out.println("数组的动态初始化");
niArr[0] = 1;
niArr[1] = 2;
niArr[2] = 3;
niArr[3] = 4;
niArr[4] = 5;
System.out.println("格式化输出结果:"+Arrays.toString(niArr));
System.out.println("数组的静态初始化");
int[] niArr2 = {1,2,3,4,5};
System.out.print("for循环输出结果:");
for(int i = 0;i<niArr2.length;i++){
System.out.print(niArr2[i]+" ");
}
}
}
|
输出结果:
数组的动态初始化
格式化输出结果:[1, 2, 3, 4, 5]
数组的静态初始化
for循环输出结果:1 2 3 4 5
|
(2)数组的最值问题
所谓的最值问题,就是求数组中元素的最大值,或者最小值。我们可以想象一下擂主产生的过程?第一个参赛者上台,假设他是擂主,后面的人来挑战他,如果打败了他,则挑战者为擂主,如果没有打败,则继续当擂主,知道所有的参赛者全部比赛完毕,留下来的就是擂主。同理数组的最值问题也迎刃而解
public class TestArray {
public static void main(String[] args) {
int[] niArr = new int[5];//数组用来存储输入的数据
int max = niArr[0];//假设数组的第一个元素为最大
Scanner scan = new Scanner(System.in);
for(int i=0;i<niArr.length;i++){
System.out.println("请输入第"+(i+1)+"名学生的成绩:");
niArr[i] = scan.nextInt();//数组的每一个元素,用来存储每一个数据输入
if(niArr[i]>max){//逐个比较数组中的元素
max = niArr[i];//如果他大于max,则调换两者的地位
}
}
System.out.println("最高分为:"+max);
}
}
|
结果:
请输入第1名学生的成绩:
55
请输入第2名学生的成绩:
88
请输入第3名学生的成绩:
55
请输入第4名学生的成绩:
66
请输入第5名学生的成绩:
99
最高分为:99
|
(3)数组的排序问题
Arrays类为我们提供的sort()方法,实现了对数组的升序排序。
public class TestArray {
public static void main(String[] args) {
int[] niArr = {54,7,99,25,41,66};//数组的定义及静态初始化
System.out.println("数组排序前:");
System.out.println(Arrays.toString(niArr));
System.out.println("数组排序后:");
Arrays.sort(niArr);//sort排序数组
System.out.println(Arrays.toString(niArr));
}
}
|
结果:
数组排序前:
[54, 7, 99, 25, 41, 66]
数组排序后:
[7, 25, 41, 54, 66, 99]
|
(4)数组的拷贝
◆通过数组变量拷贝实现数组的拷贝
数组变量拷贝实现的数组拷贝,得到的两个数组指向同一个地址空间,因此只要其中一个数组的某一个元素改变时,则也会影响到另一个数组的变化。
public class TestArray {
public static void main(String[] args) {
int[] befor = { 54, 7, 99, 25, 41, 66 };// 数组的定义及静态初始化
int[] after = new int[10];
System.out.println("原数组:" + Arrays.toString(befor));
System.out.println("目的数组:" + Arrays.toString(after));
System.out.println();
after = befor;// 数组变量拷贝实现的数组拷贝
System.out.println("数组变量拷贝实现的数组拷贝");
System.out.println("原数组:" + Arrays.toString(befor));
System.out.println("目的数组:" + Arrays.toString(after));
System.out.println();
after[3] = 1000;// 改变目的数组中的一个值
System.out.println("改变目的数组中的一个值后的结果:");
System.out.println("原数组:" + Arrays.toString(befor));
System.out.println("目的数组:" + Arrays.toString(after));
System.out.println();
}
}
|
结果:
原数组:[54, 7, 99, 25, 41, 66]
目的数组:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
数组变量拷贝实现的数组拷贝
原数组:[54, 7, 99, 25, 41, 66]
目的数组:[54, 7, 99, 25, 41, 66]
改变目的数组中的一个值后的结果:
原数组:[54, 7, 99, 1000, 41, 66]
目的数组:[54, 7, 99, 1000, 41, 66]
|
◆使用System.arrsycopy(原数组,原数组开始位置,目的数组,目的数组开始位置,拷贝的数组长度);方法完成数组间的值拷贝
public class TestArray {
public static void main(String[] args) {
int[] befor1 = { 54, 7, 99, 25, 41, 66 };// 数组的定义及静态初始化
int[] after1 = new int[10];
System.out.println("System.arraycopy实现的数组拷贝");
System.arraycopy(befor1,0,after1,0,3);//从原数组0开始拷贝三个给目的数组
System.out.println("原数组:" + Arrays.toString(befor1));
System.out.println("目的数组:" + Arrays.toString(after1));
}
}
|
结果:
System.arraycopy实现的数组拷贝
原数组:[54, 7, 99, 25, 41, 66]
目的数组:[54, 7, 99, 0, 0, 0, 0, 0, 0, 0]
|
二:二维数组
Java中支持多维数组,多为数组也就是数组的数组。
1:多维数组的定义
二维数组:数据类型[][] 数组名;
三维数组:数据类型[][][] 数组名;
2:多维数组的创建
使用new创建多维数组时,要注意:不必指定每一维的大小,只要指定最左边的位数大小即可,而如果制定了其中一维,那么这一维左边的各维都需要指定。
int [][]a = new int[2][];
int [][][] b = new int[2][3][];
|
3:多维数组的初始化
(1)直接初始化数组
int [][] a ={{1,2,3},{2,2},{3,3,3,3}};
|
(2)分开初始化
int [][] a =new int[2][];
a[0] = new int[3];
a[1] = new int[6];
|
外边要下大暴雨了。我先撤了哈。。。。![j_0005.gif](https://i-blog.csdnimg.cn/blog_migrate/28e9bdaed7d93b3f1acc32506cba056b.gif)