上一篇我们留了一道作业题,就是怎么在main方法里不用new对象的方式来调用另外两个方法,这里我就不给搭理事例了,简单的说一下,static方法中如果想直接调用某个方法,非new出来对象再调用这个对象的方法的话,只能调用同样为static的方法,也就是说,我们的那个例子里面,只要将setIntValue和getIntValue 方法都改成static的就可以了,大家自己试试;
今天我们要讲的内容是java的数组
在现实生活中,我们经常会遇到这样的情况,一些同类型的东西我们要把他们放在一起,比如说最进本的人,我们的班级,就是把学生这一类的对象都放在了一起,这些人的类型是相同的都是学生, 要对他们的操作也是相同的,都是传授知识,概括起来说,就是一种能够存放大量同性质的并且需要做相同的处理的数据的数据结构;就是数组;简而言之,就是具有相同数据类型的数据集合;从概念上来分析,重点是两个,1是相同数据类型,2是集合。
说道数组,我们就不得不提到维度,我们求学的时候都学习过,一维,二维,三维,用坐标系来解释就是线,面,空间,四维,五维就比较高端了。暂且不提,数组也可以按维度来划分,如果我们的数组中都是整数的话
我们来看看一维数组是什么样的:{1,2,3,4,5,6},这就是一条线上的各个点
再来看看二维数组是什么样子的:{(1,2),(3,4),(5,6)};这就是平面上的各个点
再来看看三维数组是什么样子的:{(1,2,3),(4,5,6),(7,8,9)};这就是空间中的各个点
注意,以上三个仅仅是介绍了概念,实际写法并不是这样
简单的介绍了数组的概念,下面我们进入代码的世界;
java定义变量的时候都要声明类型,这是老生常淡了,那么数组如何来声明呢?
在解决这个问题之前,我们要先解决另一个问题,就是我们要声明的是几维数据?
一切从简,先来说说一维数组的声明
数组中数据类型 数组名称 [] 或者 数组中数据类型 [] 数组名称
来仔细数说下,首先我们要申请数组中存放的数据的类型,然后是数组的名称,最后又一对中括号
比如我们要声明int类型的数组,那么如下:int a [];或者 int [] a;
这两种方式没有任何区别,看自己喜好就好
既然数组是同一类型的集合,那么有的时候我们肯定想要知道数据的长度是多少
就是 数组名.length,拿我们上面的int型数组来说,他的长度就是 a.length
注意是没有括号的,这个length是数组的一个属性,不是方法
上面我们仅仅是讲了如何声明,并没有讲如何初始化,初始化这个概念并不陌生,就是对数据进行赋初值的操作
数据的初始化有两种,可以称之为静态初始化,和动态初始化
静态初始化简单,来看个简单的例子:
public class IntCollection { public static void main(String[] args) { int [] intCol = {1,2,3,4,5}; System.out.println(intCol.length); } }
来看运行结果
这就是静态赋初值,声明数组的同时对其进行了初始化,这个例子同时也练习了length这个属性
动态初始化的例子稍微麻烦一些,我们来看看
public class IntDynamic { public static void main(String[] args) { int [] intCol = new int[10]; for(int i =0 ;i < 10; i ++){ intCol[i] = i * i; System.out.println(intCol[i]); } } }
来看这段代码,我们声明的时候使用了new int[10];因为数据是对象类型的, 所以我们可以通过new关键字来创建对象,因为数组是有长度的,所以我们声明的时候如果不是静态的初始化,那么我们需要声明数组的长度,这里我们把数组的长度声明为10,然后用for循环给数组的中的每个元素赋值,值就是i的平方
看看结果
这里我们看到给数组的元素赋值的时候使用的语句是 intCol[i] = i * i
这就有问题了,intCol[i]是什么东西?这就是数组intCol的第i个元素,这个i就是数组的下标,如果我们想直接使用数组的第5个元素,我们应该怎么写呢?intCol[5]么?如果是这样的话,那么你肯定没有注意到下面这个细节
for循环是从0开始的,也就是说intCol的第一个元素是IntCol[0] ;那么第五个元素是什么?intCol[4]就对了吧?
这里有必要提及的是,这个方括号中的数字是数组中元素的下标,其实跟for循环中的i没有必然联系,仅仅是因为for循环中i的值和数组的下标恰好相同而已,数组的下标是从0开始的,跟我们正常生活中从1开始不同,这一点一定要注意,后面还会遇到类似的情况,那么数组的最后一个元素就是 IntCol[IntCol.length - 1]
这个表达式目测已大家的高智商肯定能理解,IntCol.length是整个数组的长度,长度减1,就是最后一个元素了;
现在来一道课堂练习
要求:已知一下两个数组 int [] a = {1,2,3,4,5}; int [] b= {6,7,8,9,0}
输出数组中的每个元素,分别输出数组的长度
输出每个元素的时候
提示:数组中元素的名字可以这样来打印 "a [" + i + "]"
动起来,自己写写
看代码:
public class IntLength { public static void main(String[] args) { int [] a = {1,2,3,4,5}; int [] b = {6,7,8,9,0}; for(int i =0; i < a.length; i ++){ System.out.println("a[" + i + "] = " + a[i]); } for(int i =0; i < b.length; i ++){ System.out.println("b[" + i + "] = " + b[i]); } System.out.println("a[] 的长度为" + a.length); System.out.println("b[] 的长度为" + b.length); } }
我们的for循环使用的判断条件分别是每个数组的长度,第几个元素就是数组名[下标];长度,就是数组名.length ;这都没问题了,这里有一点不知道大家注意到了没有,我们的for循环的变量都是使用int i =0作为开始,那么这两个for循环之间会互相影响么?答案是否定的,不会,因为这两个for代码块是同级的,int i这个变量的作用范围仅限for循环打大括号中,两个for循环不会有任何影响,但是如果这两个for循环是嵌套关系的话,那么肯定就有问题了,有兴趣的同学自己试试
来看看运行结果
一维数组说完了,咱们来聊一聊二维数组
来个代码
public class TwoDimension { public static void main(String[] args) { char [] [] a = new char[4][10]; a[0] = new char[10]; a[1] = new char[10]; a[2] = new char[10]; a[3] = new char[10]; a[0][0] = 65; a[1][0] = 67; a[2][0] = 69; a[3][0] = 71; for(int i =0 ;i < a.length; i ++){ for(int j = 1; j < a[i].length; j ++){ a[i][j] = (char)(a[i][j - 1] + 1); System.out.print(a[i][j-1]); } System.out.println(); } } }
首先我们看,二维数组的声明,
char [] [] a = new char[4][10];
类型是char类型的,二维的,就是两个方括号,后面new的时候,两个方括号中的数字含义不同,第一个方括号可以理解为行,第二个可以理解为列,就是4行10列的矩阵,矩阵的概念大家自己去了解,这里就不说了
换一种思路就是一个数组长度是4,其中每个元素又是一个长度为10的数组
大家好好理解下
我们对长度为4的数组做了一下初始化,每个元素都是new char[10]这样一个长度为10的一维数组,
然后就相当于是对每行的第一列做了初始化,分别是 65 67 69 71,
一维数组是一层循环,那么二维数组就是两层循环了,我们这个循环是为这个二维数组中的每个元素赋值,这个a[i][j -1] + 1就是拿到前一个元素的值然后加1,作为当前元素的值,打印出来,这个打印注意了,没有ln,只是print()这样的打印是没有换行的
然后我们在内层循环结束后打了一个println()这个是换行的
来看看运行结果
恩?是不是很奇怪呢?我们从头到尾为也没输入英文字符,这些字符是哪里来的呢?
其实重点就是(char)这里,有一个强转的操作,在ASCII码中,英文字符(区分大小写)都有一个数字与之对应,具体对应表,大家自己找一找,我就不多说了,简单的说就是65对应就是大写A往后加1就是了
二维数组如何静态初始化其实跟一维是相同的
如下:
int [] [] s = {{1,2},{3,4},{5,6}}
数组就是用大括号包起来的一组,二维,就是数组套数组,三维就是数组套数组再套数组
那么三维的是什么样,大家就应该都知道了
这里我就不多解释三维数组了,大家自己练习练习就好
值得我们注意的是正常的开发中数组的使用并不是很频繁,因为一个重要原因就是一个数组一旦声明了,容量就固定了,也就是说我们声明的时候的长度,固定了之后不容改变,如果想在运行时改变,那么就是另外一种数据结构了,后面我们再讨论,这里大家记住就好;