**
P33-P38(关于数组):
**
一、Java当中数组的定义
定义规则
举例
举例一:
举例二:
int[] numbers = new int [100];
int[ ] numbers代表一个叫做 numbers 的 int 类型的数组
= new int [100];等号代表对这个数组进行初始化,创建一个新的可以放一百个 int 的数组(new无需深究,它的意思是创建)
二、认识数组
数组的特点
- 数组是一种容器(放东西的东西)
- 其中所有的元素具有相同的数据类型
- 一旦创建 不能改变大小
若违背了特点2,则会自动报错类型不匹配,eg:
数组的下标规则
数组的有效下标: 0到数组元素个数减一
若超出了有效下标,编译器不报错,但是运行时会显示 “数组的索引越过了边界 在xx那一行”:
三、未知数组元素个数时,如何写出安全的程序?
数组的元素个数可以是变量!
- 问题:
- 解决
动态的根据程序运行时候的数据来创建数组,但是数组在运行的过程当中是不能改变的!
四、每个数组的内部成员:length
每个数组有一个内部成员length,会告诉你它的元素的数量!
写程序时怎么用length?,如下
使用数组名.length
for(i=0;i<数组名.length;i++)
这样子写的好处是:
这个for循环是用来遍历整个数组的,无论数组的大小是怎么确定的,无论是固定的100还是叫做某个名字的变量,跟for循环怎么写都无关,总之这个for就是在遍历整个数组!
五、关于初始化数组
六、关于数组的赋值、普通变量与数组变量的区别
为什么下面情况中,将数组 a 赋值给数组 b 之后,改变b[0]的值,a[0]的值也被改变掉了?
解释:普通变量与数组变量的区别:
-
普通变量是所有者,在变量里面,变量拥有数据;
关于普通变量的赋值,一方的改变不会影响另一方,两者之间独立无关。 -
数组变量里面,那个变量只是一个管理者,变量里面没有数据,变量只是在管着一个放在另外某个地方的数组;
若将一个数组变量赋值给另一个数组变量,eg:int[ ] b = a,只是让那些数组元素多了一个管理者,让b去管a所管的那个数组,只是让那些数组元素有了a和b两个管理者,故 b[0]=16,就代表b所管理的数组中编号为0的那个单元变成16,当然在读a[0]的时候也是16,那个单元叫b[0]也叫a[0]。
数组变量赋值思维实例:
总结:
数组变量之间的比较是判断是否管理同一个数组?eg:
尽管上图中,a和b的内容是相同的,但是它们是两个独立不同的数组,a和b这两个管理者管着不同的数组,所以被认为是不相同的。
七、如何复制数组?
既然 int[ ] b = a
不能给我们创建一个新的数组,只是可以让它们可以管理同一个数组,那如何做到把一个数组里面所有东西交给另外一个数组呢?
必须使用遍历的方法将每个元素逐个拷贝给目的数组!
八、一个关于程序的思路点
每次想一个程序,想两件事情:数据(需要往进读什么数据?)+算法(需要什么处理?)
一个小练习
九、数组的遍历
新知识:for-each循环(一个方便的遍历数组的方式)
如同上图右边的程序所使用的for:
for(<类型> <变量> :<数组>)
{
......
}
eg:
- for(int k:data)
{
…
} - 读它的方式:对于data这个数组当中的每一个元素取出来,循环的每一轮把它拿出来作为int类型的变量k。
- 所以循环的每一轮,这个k是不断会变的,k在第一轮等于data的 0,k在第二轮等于data的 1
什么时候用for-each循环?
for(int k:data)
{
......
}
它特别适合于遍历一个数组的场合,比如 要去遍历整个数组,拿出数组的每一个元素出来去做一些事情,比如说做比较或者赋值给别人等等,这个时候特别适合用for-each循环。
什么时候不用for-each循环?
- 表达位置不能用:在for-each循环里面没有位置,当我们拿出k的时候,我们并不知道这个k是第几个;
- 改变数组不能用:我们也不能用这种循环来给数组做赋值,因为k只是一个变量,它和那个数组的某个元素之间只是一个值的对应的关系,而并不是具体存储位置的对应关系(通过for-each循环,我们不可以去修改数组,但是可以读出数组中的每一个值)