关于java中数组的知识点,具体可从一下几个方面进行论述:
1.什么是数组:
java中的数组本质上是一个包含具有相同数据类型的元素的集合。是的,没错,这里说的元素,集合之类的,和数学中的意义其实没有多大的差别。就相当于,如果有一个大叔,手里拿着一个袋子,袋子里面装了一些品种一致的金鱼。那么,那个金鱼大叔,就是你的程序,手里的袋子,就是一个数组,袋子里面的金鱼,就是数组中的元素。但是,一但袋子里出现了一条罗非鱼(关于罗非鱼的定义可自行百度。。。)!那么,一切就不一样了,因为袋子里面的元素不一致。那么大叔就是大叔,袋子就是袋子,鱼也还是鱼,和数组没多大的关系了。也就是说,要构成一个数组,需要满足这些基本条件:相同数据类型的元素,在一个指定的空间里面(袋子),元素在集合里面(鱼在袋子里)。当然,你也可以从数组这个词进行联想,即一组数据元素,不过类型要一致。
2.如何创建数组:
创建数组的格式如下:
int[] a = new int[5];
在这里,要解释的是:int[] 代表这是一个存放int类型的数据的数组,类似的也有float[],double[],char[]等类型的数组,也就是说,数组的定义可以为:
数据类型[] 变量名 //英文输入法下的中括号代表这是一个数组
后边的 new int[5]代表的是在内存中开辟一个可以存放5个int数组类型的内存空间。
另外,该种办法只是声明了一个数组a的存在,数组里面存放的数据还没有存放进去。那么,接下来,我们就要给数组赋值。如何赋值呢?那就要利用数组的下标,可是你会发现,我们前面balabala讲了一大堆,但就是没有说过下标这东西。怎么办?不急,先看一张图:
你看,这是数组a在内存中所呈现出来的样子,五个int元素都是存放在相邻的内存地址内,就相当于5个并排放着的箱子,那么,我们要从其中的一个箱子里面取出数据的时候,就要先知道在第几个箱子里面。所以,就引申出了下标这个词,他是指顺序表示数组元素的数值符号,就比如图中下标的那些数字,代表的就是一个数组中每一个数剧所在的位置。或许你会奇怪说:怎么会有第0个箱子这么奇葩的东西!但是,事实上,计算机就是这么奇葩。java规定,数组的下标是从0开始的。所以从这里也引出一个冷笑话:餐桌上,妈妈问儿子,碗里有几个饺子呀?儿子低着头,一个一个数着:0,1,2,3,4.。妈妈大怒,说:又是一个当程序员的命!你看懂这个冷掉牙的笑话了吗?恩,这就是在告诉你,数组的下标是需要从零开始滴。
好啦,说了那么多,知道了下标的左右,让我们给数组赋值吧?如果说我们要给数组a赋值5个元素,分别是1,2,3,4,5.那么我们该怎么赋值呢?
格式是这样的:
变量名[下标]=值;即
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
看到这里,或许有人会说,哎呀,怎么赋值那么鬼麻烦!!!别担心,我们有更简单的方法,就是利用数组的遍历。接下来就会说到,好奇心的同学也可以先想一下怎么操作。提示:和for循环有关哦!
————————–此处停止10秒,以供各位思考—————————–
首先,什么叫遍历?其实就是把数组从头到尾(或者从尾到头)全部扫描一次,然后进行0或多种的数据操作的过程。什么意思?就是我们从数组中,按照下标的顺序,依次取出封存在该数组坐标中的数值,然后进行各种操作,比如运算,替换等等等等,也可以不作任何操作,只是将其打印在屏幕上。那么,既然要依次顺序执行,我们是不是想到了我们的for循环呢?且看一个简单的实例:
你看,这里就借助了一个for循环,遍历数组来给元素赋值,也借助了一个for循环来遍历数组,打印数组内储存的元素。
那么,了解了数组的遍历之后,应该也就明白了数组是如何实现批量处理数据了吧。同时,数组在程序中的作用也经常用于循环遍历操作。
注意:数组一旦创建之后,它的长度便不可改变。数组的最大下标为数组的长度-1。当然,数组的长度可以为0,但并无多少应用意义。
3.数组的属性
数组具有一个长度属性length,用来返回当前数据的长度,使用方法见图:
4.foreach循环
上一章java循环三剑客最后,我们说到会在数组中讲解for循环的增强型foreach循环,现在就来给大家介绍一下他的用法。
for(变量:需要遍历的数组或者集合){
循环体
}
从这个格式就可以看出。foreach循环和for循环有比较大的区别:在于使用foreach去循环遍历数组或者集合的时候,是不需要获得数组或者集合的长度的,也无须根据索引来访问数组元素和集合元素,foreach循环自动遍历数组和集合的每一个元素,并且将遍历的值赋值给变量。这一这里的变量是要和数组的数据类型保持一致!
其工作大致流程如下:
虽然丑了点,但基本可以描述清楚了,且看:
第一次循环:从数组中取出下标为0的数据,赋值给b,进入循环操作,结束操作之后,转入第二次循环。。。
第二次循环:从数组中取出下标为1的数据,赋值给b,此时b指向元素2,进入循环操作,结束之后,转入第三次循环。。。
由此类推,直到遍历完一个元素之后,自动退出循环。
再看一个实例来验证这个流程:
如何,是不是觉得这样的话比for更容易理解?的确,foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。相对老的for语句来说是个很好的补充。但是,他也有个不好的地方:foreach一般只适合做数组的遍历,提取数据,显示数据等,并不适用于增加或者删除和使用下标等复杂的操作。所以,如果涉及到利用下标对数组进行操作的地方时,foreach就没什么用场了。参见浅析java的foreach循环。
二维数组:
提醒!接下来的知识点涉及到了时间空间物理维度地理维度等诸多知识点!!好吧其实并没有,所以不用太担心~~~
所谓二维数组,看题目似乎很高大上。那么如果你把我们前面所说的数组叫做一维数组的话,那么这个东西也就更浅显易懂了?且看一个问题:
一个数组可以存放相同类型的数据,那么一个数据可以存放相同类型的数组吗!当然也可以,不然我们就不用说二维数组了呀~~
是的,所谓二维数组,就是一个数组里面又存了许多个数组。相当于嵌套一般。其格式为
数据类型[][] 变量名 = new 数据类型[][];
比如:int[][] c = new int[][];
在这里,把int[]看作一个整体,那么就是int[][] c=new int[][]了。结合前面的知识,你应该也了解了何为数组里面的数组了吧。。
那么,请问:int[][] c = new int[3][2];是个怎样的数组呢?它其实是这样的:
从创建数组的方法可以看出,其要存储的数据类型是一个int[3]的数组,也就是一个包含了三个int存储单元的int型数组。如图中红色部分。那么这个二维数组共有多少个存储一维数组的空间呢?答案为2个,即绿色部分。所以,我们由此可知:在int[][] c = new int[3][2]中,前面的3代表的是一位数组的存储单元,2代表二维数组的存储单元。其他数字亦然。
或许有人会问,既然有二维数组,那么也会有三维,四维,甚至100维数组吗?理论上是有的,但是在真正的开发过程中,因为如果嵌套多维的数组,那么极容易在代码的维护中产生极大的阻碍,因此并不推荐使用多维数组,二维已是极限。
二维数组的遍历既然有一维数组的遍历,那么毫无疑问,自然也有二维数组的遍历。那么他的格式是怎样的呢?答案如下:
for(int i=0;i < c.length;i++){
for(int j=0;j<c[i].length;j++){
c[i][j];
}
}
你看,这里使用了for的嵌套循环来实现二维数组c的遍历,在最外一轮的循环中,是以数组c的长度为限,即先遍历二维数组的储存单元,再在每一个循环遍历的过程中遍历一维数组的内部存储单元。
数组的实践:对数组进行排序
最后以一个学习数组时经常使用的案例作为练习结尾,对数组a={2,8,6,9,7,1,11,3}进行排序。
提示:利用for循环
答案将在下期贴出。