大家好,我是浩哥。
说好今天要更新的,所以昨天才偷了一下下懒,真的,就那么一下下,超乖的我今天又开始老老实实地码字了。
最近天气可真不是一般的热。就连有“火炉”之称的重庆都没我老家广东热。(可能因为我去重庆浪的那几天经常下雨吧~)在街上逛多一小会儿身体都像快要融化了一样。在我看来,这种天气最适合在空调房里呆上一天当肥宅了!
泡一天咖啡馆(蹭一天空调),点上一杯冰拿铁,懒洋洋地躺在沙发上,打开电脑做自己想做的事情,岂不快哉?
在这一讲里,我们将继续上一讲未完成的话题------Java数组~
【小目录】
读完后,相信你能掌握以下干(dry)货(cargo):
1.数组元素的使用
2.数组的初始化
3.length的使用
4.数组的引用
一.数组元素的使用
其实在上一讲也提到过Java怎么使用数组中的元素,通过【数组名+索引】就可以了。不过在上一讲中,关于索引的介绍主要只是停留在它的含义上面,在这里,我将展开介绍一下它的具体使用方法,包括在一维数组及二维数组中怎么通过索引来达到使用其元素的目的。
继续用上一讲中的例图进行讲解吧~
在如图的一维数组中,
如果想使用数组中“45”这一元素,可以用“数组名a+索引0”达到目的,即
a
如果想使用数组中“135”这一元素,可以用“数组名a+索引2”来达到目的,即
a[2]=135;
这一数组中共有5个元素,但是由于索引是从0开始而非从1开始的(这一点在上一讲中也有所强调),所以索引最多到4就没有了。
如下图是一个二维数组,
二维数组调用元素也是通过【数组名+索引】进行操作,它与一维数组不一样的是,它比一维数组多一个索引,具体一点就是【数组名+第一个索引+第二个索引】。
如果想知道山中大学的专业1录取了多少学生,可以用“数组名a+第一个索引0+第二个索引0”达到目的,即
a[0][0]=98;
如果想知道头汕大学的专业5录取了多少学生,可以用“数组名a+第一个索引2+第二个索引4”达到目的,即
a[2][4]=90;
其实,在二维数组中,第一个索引可以简化理解为从0开始编起的数据行编号,如:第一行数据的编号为0,第二行的编号为1,第三行的编号为2。第二个索引则可以理解为从0开始编起的数据列编号,如:第一列数据的编号为0,第2列的编号为1......以此类推。
从这两个例子中不难发现第一个索引的变化范围是从0到2,第二个索引的变化范围是从0到4。当我们用索引对数组的元素进行操作时,一定要不能让索引越界,否则运行时会发生异常。
举个栗子,
如果我们想用a[1][5]来调用上面这个二维数组中的元素,运行时就会出现异常,因为这个数组的第二个索引最大值仅为4,代码中的索引显然越界了。
二.数组的初始化
所谓数组的初始化,就是在数组创建完后程序员或系统给每个数组元素赋上一个初始值的过程。
那么,究竟何时是程序员,何时是系统进行赋值呢?
程序员可以提前为数组中的每个元素进行逐一赋值,例如:
int a[] = new int[5]; //声明并创建数组
a[0] = 2;a[1] = 16;a[2] = 89;a[3] = 76;a[4] = 65;//对每个元素逐一赋值
如果觉得上面的逐一赋值方法比较麻烦,也可以在声明数组的同时给数组元素赋上一个初始值,就像下面这样,
int a[] = {2,16,89,76,65};
如果程序员没有提前为数组元素赋上初始值,系统就会自动给每个数组元素一个默认的初始值,例如,int型元素的初始值为0,float型元素的初始值为0.0。
三.length的使用
何为length?length的意思是数组的长度,它代表数组中的元素个数。
在一维数组中,“数组名.length”的值为数组中的元素个数;
举个栗子,
int a[] = new int[5];
//这种写法其实是将此前所讲的数组的声明与创建合并在一起了,它等价于int a[];a[] = new int[5];
那么a.length的值为5,即一维数组a中含有5个元素。
而在二维数组中,“数组名.length”的值则表示该数组所含有的一维数组的个数。
例如,
float b[][] = new float[3][5];
那么b.length的值为3,也就是说二维数组b含有3个一维数组。
四.数组的引用
我们要知道,数组是一个引用型的变量。
引用就是通过一个类似于指针的东西(之所以说“类似”,是因为Java中只有引用,没有指针,但是它又类似于C/C++中的指针,那么它们之间的区别是什么呢?区别就是,C/C++中的“指针”可以被用户直接修改,而在Java中是不允许用户对内存直接修改的),指向内存中的某一个区域,从而帮助我们找到想要的东西。
其实可以这样简化理解,数组变量本身存放的不是具体的东西,而是该东西的所在地址。我们可以通过这个地址找到想要的具体东西。
大家看看下面这个例子就懂了。
public class Hello_Haoge {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[]={2,4,5,6,7};
System.out.println("数组a的引用="+a);
System.out.println("a[0]="+a[0]+",a[1]="+a[1]+",a[2]="+a[2]+",a[3]="+a[3]+",a[4]="+a[4]);
}
}
从截图中的运行结果可以看到,倘若直接把数组a这一变量打印出来的话,得到的并非是数组a中的元素值,而是一串地址,这串地址可以帮助我们在内存中找到想要的东西。如果想要打印出数组a中的元素值的话,就需要利用索引来逐一打印了。
看到这里,有朋友可能会感到疑惑。
为什么数组变量中不直接存放具体的内容呢?
其实我们可以试想一下,假如数组中包含有成千上万个元素,那么,在对该数组进行相关操作例如拷贝时,就得把这成千上万个元素搬来搬去,这岂不是增加了时间成本,大大降低了程序运行的效率?
因此,更好的解决办法就是,通过保存内存地址,找到我们想要的东西。然而这些内存地址一般都是一串又长又臭且无规律可言的字符(不信的话看上面截图),要记的话相当麻烦,所以就给存放这些地址的“仓库”取个相对简单一点的名称,这个“仓库”其实就是引用变量,也就是我们常说的数组了。
这一讲到这里就已经接近尾声了,Java数组的主体内容也讲完了,不知道大家对这一块知识点理解了多少呢?
如果有任何疑问,或者发现浩哥的讲解出错了想要纠正的,或者有任何建议想告诉浩哥的朋友,都欢迎在公众号留言或者私加微信跟我联系哦~
如果觉得文章还不错或者对你成长有那么一丢丢帮助的话,可以给辛苦的创作者(没错就是我)点一个小小的赞吗?(嘿嘿)
下期预告:
1.《山城?雾都?火炉?》
2.《xxx》(还没想好)