零、复习昨日
经验:当循环次数已知用for最合适,当循环次数未知用while最合适。
一、 数组(array)
1.1 为什么需要数组
考虑问题:存储一个人的考试成绩,double score = 100;
存储60个人的成绩,???? 数组更合适
1.2 数组是什么
数组相对于是容器,可以转载(存储)多个数据。
特点:
数组一旦创建,容量(长度)固定
数组一旦创建,存储的数据类型固定
内存空间的特点:程序在jvm中运行,Java程序运行需要考费电脑内存空间。
数组的内存空间特点:
是在堆中创建;
是连续空间;
每个空间有下标(索引);
1.3 数组的使用
数组使用:声明;创建;存取数据
整型数组,默认存储0
浮点型数组,默认存储0.0
字符数组,默认存储 ‘ ’(空格)
布尔型数组,默认存储false
String数组,默认存储null
1.3.1 数组声明
数据类型[] 数组名;
1.3.2 数组创建
数组名 = 数据类型[长度];
arr = int[3];
1.3.3 使用数组
使用数组就只会存取;
取值:数组类型 变量 = 数组名[下标];
下标0~下标-1;接收的变量的类型和数组类型一致。
存值:数组名[下标] = 值;
数组的细节总结:
数组中的每⼀个数据称之为数组元素
数组中的每⼀个元素都对应有⼀个下标
数组中的下标范围0~数组的长度-1
数组的长度通过数组名.length获取
数组的长度如果超出的边界会报错(ArrayIndexOutOfBoundsException数组下标越界异常)
1.4 数组的内存图
方法执行会进栈
凡是 new 的,都会在堆中开辟空间
new int[3];这行代码做了什么?
会在推重开辟连续空间
且给控件设置下标,0~长度-1
且给每个空间赋默认初始值
给每个控件设置了内存地址
int[] arr = new int[3];赋值给arr的是什么? arr其实是数组在内存的地址。
System.out.print(arr);// 输出内存地址
![](https://i-blog.csdnimg.cn/blog_migrate/ce247480b5e74b0b858f6e8355cf48e0.png)
int a = arr[0]; 这行代码做了什么?
1. 通过arr,arr本后是数组的地址,即通过地址找到数组
2. arr[0],找到数组中下标为0的那个准确位置
3. 将值取出赋值给前面的变量a
![](https://i-blog.csdnimg.cn/blog_migrate/ccd73747affa771666946e13397cb3ec.png)
arr[0] = 11; // 这行代码干了啥?
1. 通过arr背后的地址找到数组
2. 通过[0] 找到对应下标位置
3. = 11,给这个位置直接覆盖值为11
4. 以后这个位置就是11,除非再次修改
![](https://i-blog.csdnimg.cn/blog_migrate/7296d07430d705c1a2c4e4794fa384cf.png)
1.5 数组的静态初始化
之前使用 int[] arr = new int[3];
何为动态?这样创建出的数组,只是默认值,会随着程序运行,动态赋值。即向指定长度,后来再赋值
静态初始化,就是提前确定(提前指定)数据,不指定长度。这样就是静态初始化。
int[] arr = new int[]{44,55,66} ;
静态初始化是指定数据,不指定长度,长度会自动计算(有length属性)
静态初始化的简化格式;
数据类型[] 数组名 = {值1,值2,值3……}
int[] arr = {1,2,3,4,5,6};
1.6 数组的遍历
遍历:一个一个地找到数组的元素
二、 总结
数组:声明;创建;使用
创建:
长度一致就使用动态创建
数据已知就是用静态创建
使用:存值、取值
重点:数组的内存图会画;遍历
单词
reverse:颠倒;反转;
thread:线程;
ArrayIndexOutOfBoundsException:数组下标越界异常;