五、引用数据类型——数组的使用

数组

    什么是数组?数组就是一组数据类型一致的集合。

    在之前的学习我们知道八大基本数据类,而我们现在学习的引用数据类型,这里大家先记住引用数据类型,稍后补充。举个例子,我们现在有个需求,想统计每个班级同学的成绩,一个年级有5个班级,每个班级40人,这时候我们用基本数据类型将会十分麻烦,需要定义200多个变量,十分麻烦,这时候我们用数组来解决这个问题就会十分方便。

一维数组

  简单的解释一下,一维数据就是 数据只有一行的数组

我们来举个简单的例子玩一下

代码演示:

package test;

public class Test {
	//使用数组装载12个月的天数,然后输出演示,简单认识数组的初始化
	public static void main(String[] args) {
		//定义一个一维数组,装载12个月每个月的天数
		int[] month = {31,29,31,30,31,30,31,31,30,31,30,31}; 
		
		//我们看看我们的数组长度
		//我们使用数组的length属性查看,用法: 数组名.length
		int length = month.length;
		System.out.println("数组的长度:"+length);
		
		//输出12个月的每个月天数
		//注意:数组的下标从0开始
		for(int i = 0; i < length;i++){
			System.out.println("第"+(i+1)+"个月的天数有:"+month[i]+"天");
		}
	}
}

代码结果:

代码讲解:

    在定义数组的时候我们可以看到数组是这样定义的 int[] a,没错,八大基本数据类型只要带上[],就可以定义出一组类型相同的数组,如:int[] a 定义出来的就是每个数据类型都是int类型的数组,我们想获取数组的长度就是 数组名.length ,然后记得数组下标是从0开始的。


然后现在给大家画个图,我们来接着认识一下数组在内存的存储方式


重点:

1.数组的长度:数组名.length

2.int[] month, 这样month这个变量名将会指向整个数组

3.数组的下标是从0开始的,所以开始的值month[0]

4.数组第n个位置的值,可以通过数组名[n-1]取得

    答案:

5.因为数组下标是从0开始的,所以最后一个元素的下标值为month.length-1

6.数组是引用数据类型,所有month指向的是内存空间中分配的地址号,假设有一排车库,叫A号车库,有12个位置,第3个位置的车应该找A[2]位置的车库门牌号,这样我们就能找到第三个位置的车。


接下来,我们再来讲讲最常使用的数组声明和内存分配的方法

代码演示:

package test;

public class Test {
	public static void main(String[] args) {
		int[] a;			//声明一个一维数组a
		a = new int[10];	//分配给数组十个内存空间
		
		//通过下标,对数组a进行赋值
		a[3] = 5;
		a[a.length-1] = 55;
		
		//通过for循环获取数组的值
		for(int i = 0 ;i < a.length ; i++){
			System.out.println("a["+i+"]="+a[i]);
		}	
	}
}

代码结果:


代码讲解:看到结果有意思吧,上述的数组声明和分配内存空间的方式,是我们最常使用的方法,而且我们一般缩写成 int[] a = new int[10];一句话解决,然后我们对a[3]和a[9]进行了分别为5 和 55 的赋值,然后用for循环输出发现,其他的值全是0。这里给大家讲一下,当我们声明数组,并分配内存空间的时候,数组会默认赋值,即int类型会自动赋值为0,char类型会默认赋值" ",一个空格的字符。其他类型的默认赋值,大家有兴趣可以自己在代码里尝试输出即可。


现在我们来给大家演示一下,初学者最容易犯的十大错误之一,我来给大家演示一下

错误1: java.lang.ArrayIndexOutOfBoundsException,数组下标越界异常

代码演示:

package test;

public class Test {
	public static void main(String[] args) {
		int[] a;			//声明一个一维数组a
		a = new int[10];	//分配给数组十个内存空间
		
		//通过下标,对数组a进行赋值
		a[3] = 5;
		a[a.length-1] = 55;
		
		//通过for循环获取数组的值
		for(int i = 0 ;i <= a.length ; i++){
			System.out.println("a["+i+"]="+a[i]);
		}	
	}
}

代码结果:


代码讲解:我们来看看错误,尝试去读一下,在java.lang包下有一个ArrayIndexOutOfBoundsException异常,异常值是10。然后是at test.Test.main(Test.java:14)即在test包下,Test类的main方法里出的问题。即我们写的现在这个测试类出问题,问题指在代码第14行。我给大家看一下我在哪里错了


我们读一下for循环的意思,从i = 0开始到i<=10,这样就出现了11个数字,而我们给的数组只有10个内存空间地址。这样最后一个数组下标值是a[10],而我们分配的下标最大只能到a[9]。没错了ArrayIndexOutOfBoundsException:10,指的就是这里出问题了。也就是我们a[10]越界了,最大只有a[9]。然后想个问题,我们明明在13行犯的错误是,为什么指的是at test.Test.main(Test.java:14)14行?,这里大家可以看一下第四章的程序控制结构的for循环讲解,如果想不出来,欢迎大家给bigdodo评论留言,bigdodo一定会给大家的留言和问题给予解决



二维数组

    有时候我们会有需要用的上二维数组,比如我们有三个同学,每个同学有三门成绩,分别是语文,数学,英语的成绩,我们怎么用数组存放和使用呢,我来给大家演示一下

代码演示:

package test;

public class Test {
	public static void main(String[] args) {
		int[][] score = {{96,87,95},
				 {56,89,69},
				 {87,58,98}};   //定义一个三行三列的数组并且赋值
		
		//对三名同学的成绩输出
		//定义计算器i,用来确定是哪个同学
		for(int i = 0 ; i <= 2; i++){
			//定义计数器j,用来确定是哪门成绩
			for(int j = 0; j <= 2; j++){
				System.out.println("第"+(i+1)+"个同学的第"+(j+1)+"门成绩是:"+score[i][j]);
			}
		}
	}
}

代码讲解:

    这就是二维数组的定义和初始赋值的用法,数据初始化记得有几行,里面就会有几组{  },每行数据都用","隔开,每一组内的数据也都用","隔开。

    二维数组的取值,我们需要使用for循环的嵌套,这里算是第四章程序控制结构的for循环的扩展用法,比较常用,如果大家需要bigdodo给补充if-else,和for循环结构的嵌套使用,欢迎大家给bigdodo留言,bigdodo会再写多一个章节重点详细的介绍使用

图片理解:


多维数组

   多维数组一般指的是三维的数组,需要几维的数组就在类型的后面加多少对[]即可,所以三维数组声明应该是int[][][],一次类推思维数组int[][][][]。

代码演示:

package test;

public class Test {
	public static void main(String[] args) {
		//想象一个2*2*2的正方体
		//我们声明一个三维数组,并且赋值
		int[][][] a = {
				{{1,2},{3,4}},
				{{5,6},{7,8}}
		};
		
		//因为是三维数组,所以需要使用三层for循环输出
		for(int i = 0;i <= 1; i++){
			for(int j = 0;j <= 1; j++){
				for(int k = 0;k <= 1; k++){
					System.out.println(a[i][j][k]);
				}
			}
		}
	}
}

代码讲解:

声明三维数组,我们需要又空间几何的概念,以这个2*2*2的三维模型为例,我们可以知道这个三维数组首先x层应该是有两组数据,然后y是2,所有每组数据里面也应该为两组数据,z是2,所以在进每一组里应该是两个数据。最终结果应该是2*2*2=8个数据。同理当一个三维的模型要求是2*4*3,定义的三维数组应该是int[2][4][3]。



    总结点评:在引用数据类型里面,数组也是最常用的一个数据类型,在这块学习上大家多练习一些例子,即可掌握对数组的学习。下面给大家推荐一些博主写的关于数组有趣的算法,大家可以学习一下。


冒泡排序:https://blog.csdn.net/shuaizai88/article/details/73250615点击打开链接




    



阅读更多
个人分类: java极速入门
所属专栏: JAVA实例入门
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭