JavaSE(04) - 数组
p54 数组介绍
数组是一种容器, 可以用来存储同种数据类型的多个值.
- 数组容器在存储数据时, 需要结合隐式转换考虑.
- 例如 : int 类型的数组容器可以兼容(byte, short, int)
- 例如 : double类型可以兼容(byte, short, int, long, float, double)
- 建议 : 容器的类型, 和存储数据的类型保持一致.
数组的定义与静态初始化
数组的定义
格式1 : 数据类型 [ ] 数组名 范例 : int [ ] array
格式2 : 数据类型 数组名 [ ] 范例 : int array [ ]
数组的初始化
初始化 : 在内存中,为数组容器开辟空间,并将数据存入容器中的过程.
静态初始化
完整格式 : 数据类型[ ] 数组名 = new 数据类型 [ ] {元素1, 元素2, 元素3 ...};
简写格式 : 数据类型[ ] 数组名 = {元素1, 元素2, 元素3 ...};
p55 数组地址值和元素访问
地址值的含义 : " [ " : 表示当前时一个数组. I/D : 表示当前数组数据类型, @ : 间隔符号, 后面的东西才是真正的地址值, 平时我们习惯把整体叫做数组的地址值.
数组元素访问
获取一个元素 格式 : 数组名 [ 索引 ] ;
public static void main(String[] args) {
int[] array1 = new int[]{1, 2, 3, 4};
int[] array2 = {9, 8, 7, 6};
System.out.println(array1[0] + "+" + array2[3]);
} //结果 1+6
把数据存储到数组中 格式 : 数组名 [ 索引 ] = 具体数据 / 变量 ;
array1[0] = 100;
System.out.println(array1[0]);// 100
p56 数组的遍历
数组遍历 : 将数组所以内容取出来, 取出来之后可以(打印, 求和, 判断)
注意 : 遍历是指取出数据的过程, 不要局限的理解为,遍历就是打印.
数组的最大索引 = 数组长度 - 1 ;
for (int i =0;i<array1.length;i++){ //调用数组长度 " 数组名.length "
System.out.println(array1[i]);//遍历数组
}
System.out.println("长度为"+array1.length);//结果: 长度为4
idea提供的快速生成数组遍历的方法, **数组名 . fori **
练习 : 遍历数组并求和
需求: 定义一个数组, 存储1,2,3,4,5 , 遍历数组每一个元素, 求数组里面所以数据和.
public static void main(String[] args) {
int [] arr = {1,2,3,4,5};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
sum += arr[i];
}
System.out.println("数据的和是: " + sum);
}
练习 : 统计个数
需求 : 定义一个数组, 存储1,2,3,4,5,6,7,8,9,10 ,遍历数组, 统计一共有几个能被3整除的数
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
int count = 0;//几个能被3整除的数
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 3 == 0){
System.out.println(arr[i]);
count++;
}
}
System.out.println("有"+count+"个数能被3整除.");
}
练习 : 数据变化
需求 : 定义一个数组, 存储1,2,3,4,5,6,7,8,9,10 ,遍历数组, 要求1: 如果是奇数,就将当前数字扩大两倍. 要求2: 如果是偶数,就将当前数字变成二分之一.
建议大家一个循环做一件事情,如果一个循环做的事太多,自己的思路就会混淆.
public static void main(String[] args) {
int [] arr = {1,2,3,4,5,6,7,8,9,10};
//第一个循环,遍历和修改元素
for (int i = 0; i < arr.length; i++) {
if (arr[i]%2==0){//偶数
arr[i]/=2; //除以2
}else { //奇数
arr[i]*=2; //乘以2
}
}
//第二个循环,遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
/*建议大家一个循环做一件事情,如果一个循环做的事太多,自己的思路就会混淆.*/
p57 动态初始化和常见问题
数组的动态初始化
初始化时只给定数组长度, 由系统为数组分配初始值.
格式 : 数据类型 [ ] 数组名 = new 数据类型 [ 数组长度 ] ;
范例 : int [ ] arr = new int [3];
数组默认初始化值的规律
整数类型 : 默认初始化值为 0
小数类型 : 默认初始化值为 0.0
字符类型 : 默认初始化值为 '/u0000' 就是空格
布尔类型 : 默认初始化值为 false
引用数据类型 : 默认初始化值为 null
数组的动态初始化和静态初始化的区别
- 动态初始化 : 手动指定长度, 由系统给出默认初始化值.
只明确元素个数, 不明确具体数值, 推荐使用动态初始化.
举例 : 使用数字容器来存储键盘录入的5个数.
int [ ] arr = new int [5];
- 静态初始化 : 手动指定数组元素, 系统会根据元素个数, 计算出数组的长度.
需求中已经明确了要操作的具体数据, 直接静态初始化即可.
举例 : 将学生成绩存储入数字中 分别为 : 11, 22, 33
int [ ] arr ={11,22,33};
p58 数组的常见问题
当访问了数组中不存在的索引, 就会引发索引越界异常
为了避免索引越界异常, 我们要知道索引的范围, 最小索引 : 0 , 最大索引 : (数组长度 - 1)
数组的常见操作练习-求最值
练习 : 求最值
需求 : 已知任意数组和元素, 找出最大值打印在控制台.
/*
1. max的初始化值一定要是数组元素中的值.也不一定时第一个元素.
2. 循环开始条件如果为0, 那么第一次循环就是自己和自己比,对结果没影响,但效率偏低,为了提高效率,减少一次循环次数, 循环开始条件可以改为1.
*/
public static void main(String[] args) {
int[] arr = {60, 56, 90, 123, 75, 12, 8, -1, 44};
int max = arr[0];//初始值为0索引元素的值,临时认为它是最大值
for (int i = 0; i < arr.length; i++) {
if (arr[i] < max){ //拿每一个元素和max比较
max = arr[i]; //比max大就赋值给它,替换掉值小的数
}
}
System.out.println(max);
p59 数组练习2-求和统计个数
练习 : 需求 : 生成10个 1~100之间的随机数存入数组.
- 求出所以数据的和.
- 求所有数据的平均数.
- 统计有多少个数据比平均数小.
public static void main(String[] args) {
Random random = new Random();
int[] arr = new int[10];
int sum = 0;//和
int count = 0;//统计数字
for (int i = 0; i < arr.length; i++) {
int num = random.nextInt(100) + 1;
arr[i] = num; //把获得的随机数赋值给每个元素
sum += arr[i]; //累加所有元素
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); //遍历数组
if (arr[i] < sum / arr.length) {
count++; //小于平均数就累加
}
}
System.out.println("元素之和为: " + sum);
System.out.println("平均数为: " + sum / arr.length);
System.out.println("有" + count + "个数据小于平均数.");
}
p60 练习3-交换数据
需求 : 定义一个数组, 存入1,2,3,4,5. 按照要求交换索引对应的元素.
交换前 : 1,2,3,4,5
交换后 : 5,4,3,2,1
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int temp = arr[i];//定义临时变量存入数组前面的元素
arr[i] = arr[j]; //后面交换到前面
arr[j] = temp; //前面交换到后面
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
p61 练习4-打乱数组中的数据
需求 : 定义一个数组, 存入1~5. 要求打乱数组中所有数据的顺序.
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int index = r.nextInt(arr.length);//获取数组中的随机索引
int temp = arr[i]; //临时变量中存入前面的元素
arr[i] = arr[index]; //把随机数元素赋值给前面
arr[index] = temp; //把前面的元素赋值给随机数元素
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
p62 数组的内存图
总结 : 当两个数组指向同一个小空间时, 其中一个数组对小空间的值发生了改变, 那么其它数组再次访问的时候就是修改之后的结果了.